我从SQL Server JDBC驱动程序中收到一个奇怪的错误。它告诉我列名无效,即使该列存在,正确命名并且在SqlServer Management Studio中执行时相同的查询也能正常工作。
错误是:
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The column name MarginCall is not valid.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.findColumn(SQLServerResultSet.java:626)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getBigDecimal(SQLServerResultSet.java:2570)
at org.apache.commons.dbcp.DelegatingResultSet.getBigDecimal(DelegatingResultSet.java:305)
...
答案 0 :(得分:14)
问题解决了。这是我的一个简单错误。
我的查询在select语句中使用了'AS'子句。我试图使用实际的列名从ResultSet中检索列值,而不是在AS子句中定义的列别名。
小学生错误。为浪费时间道歉。
非常感谢Steve B.建议使用ResultSet.getColumnNames()。虽然我使用的实际方法调用是ResultSet.getMetaData()。getColumnName(columnIndex);
答案 1 :(得分:1)
检查您的表名称的大小写。如果在ms sql server上将collation设置为区分大小写,则表名也会受到影响。
答案 2 :(得分:0)
尝试将列名括在方括号内:[MarginCall] 只是一个猜测。
答案 3 :(得分:0)
如果Entity
和SELECT
语句值不匹配,则会引发相同的问题。
检查以下示例:
实体
@Setter
@Getter
@NoArgsConstructor
@Entity
@Table(name = "country")
public class Country {
@Id
private Integer id;
private String name;
private String code;
}
存储库
public interface CountryRepository extends JpaRepository<Country, Integer> {
@Query(nativeQuery = true, value = "SELECT id, name FROM country WHERE isActive = 'true' ORDER BY name")
List<Country> findIdAndNameAndCodeByIsActiveTrue();
}
在这种情况下,它将引发异常
com.microsoft.sqlserver.jdbc.SQLServerException: The column name code is not valid.
因此,如果您没有在*
语句中使用SELECT
,那么最好使用Projections
。
希望这可以帮助使用框架的人。