使用 JDBC 时 SQL Server 异常:“列名 xxx 无效”

问题描述 投票:0回答:4

我从 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)
...
java sql-server jdbc
4个回答
17
投票

问题解决了。这是我犯的一个简单的错误。

我的查询在 select 语句中使用了“AS”子句。我试图使用实际的列名称而不是 AS 子句中定义的列别名从 ResultSet 中检索列值。

小学生的错误。抱歉浪费了时间。

非常感谢 Steve B. 使用 ResultSet.getColumnNames() 的建议。虽然我使用的实际方法调用是 ResultSet.getMetaData().getColumnName(columnIndex);


1
投票

检查表名的大小写。如果在 MS SQL Server 上将排序规则设置为区分大小写,则表名称也会受到影响。


1
投票

如果

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
的一部分可用的所有列。


0
投票

尝试将列名称括在方括号内:[MarginCall] 只是猜测。

© www.soinside.com 2019 - 2024. All rights reserved.