簡體   English   中英

SQL Server 異常:使用 JDBC 時“列名 xxx 無效”

[英]SQL Server Exception: “The column name xxx is not valid” when using 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)
...

問題解決了。 這是我的一個簡單錯誤。

我的查詢在 select 語句中使用了“AS”子句。 我試圖使用實際的列名而不是 AS 子句中定義的列別名從 ResultSet 中檢索列值。

小學生錯誤。 為浪費時間道歉。

非常感謝 Steve B. 建議使用 ResultSet.getColumnNames()。 雖然我使用的實際方法調用是 ResultSet.getMetaData().getColumnName(columnIndex);

檢查表名的大小寫。 如果排序規則在 ms sql server 上設置為區分大小寫,則表名也會受到影響。

嘗試將列名括在方括號內: [MarginCall] 只是猜測。

如果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

希望這對使用框架的人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM