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

时间:2010-01-21 16:13:08

标签: java sql-server jdbc

我从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)
...

4 个答案:

答案 0 :(得分:14)

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

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

小学生错误。为浪费时间道歉。

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

答案 1 :(得分:1)

检查您的表名称的大小写。如果在ms sql server上将collat​​ion设置为区分大小写,则表名也会受到影响。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果EntitySELECT语句值不匹配,则会引发相同的问题。

检查以下示例:

实体

@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

希望这可以帮助使用框架的人。