我从 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)
...
问题解决了。这是我犯的一个简单的错误。
我的查询在 select 语句中使用了“AS”子句。我试图使用实际的列名称而不是 AS 子句中定义的列别名从 ResultSet 中检索列值。
小学生的错误。抱歉浪费了时间。
非常感谢 Steve B. 使用 ResultSet.getColumnNames() 的建议。虽然我使用的实际方法调用是 ResultSet.getMetaData().getColumnName(columnIndex);
检查表名的大小写。如果在 MS SQL Server 上将排序规则设置为区分大小写,则表名称也会受到影响。
如果
Entity
properties 和 SELECT
语句 column 值不匹配,也会引发同样的问题。
检查以下示例:
实体
@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.
因此,如果您不需要所有列作为响应,请使用 Projections 作为返回类型,或在
entity
查询中提及作为 select
的一部分可用的所有列。
尝试将列名称括在方括号内:[MarginCall] 只是猜测。