網頁

2020/4/15

Spring JDBC SQLException Invalid column name錯誤

今天在Spring Data JPA使用JdbcTemplate查詢Oracle資料庫時,出現java.sql.SQLException: Invalid column name錯誤。

原本以為是程式中的sql語法有錯,因為console錯誤訊息中有bad SQL grammar的文字如下。

Caused by: org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [select ... from ... ]; nested exception is java.sql.SQLException: Invalid column name
   at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:234) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
   at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) ~[spring-jdbc-5.1.5.RELEASE.jar:5.1.5.RELEASE]
    ...
Caused by: java.sql.SQLException: Invalid column name
   at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3724) ~[ojdbc6.jar:11.2.0.4.0]
   at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:2799) ~[ojdbc6.jar:11.2.0.4.0]
    ...

但把程式中的sql拿到SQL Developer中執行卻可正常查詢,最後才發現其實不是程式中的sql語法有錯,而是取得查詢資料的RowMapper中試圖取得不存在的欄位名稱而導致錯誤。

錯誤範例如下。

public List<Employee> getEmployeeList(QueryDto queryDto) {
    String sql = "select ID, NAME, AGE from EMPLOYEE where AGE > :age"; // <-- 並無查詢EMAIL欄位
    MapSqlParameterSource params = new MapSqlParameterSource("age", queryDto.getAge());
    ...
    return jdbcTemplate.query(
            sql,
            params
            (rs, rowNum) -> {
                return Employee.builder()
                        .id(rs.getInt("ID"))
                        .name(rs.getString("NAME"))
                        .age(rs.getInt("AGE"))
                        .email(rs.getString("EMAIL")) // <-- 查詢結果中無此欄位,所以造成錯誤
                        .build();
            });
    ...
}


沒有留言:

張貼留言