今天在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();
});
...
}
- Spring JDBC MapSqlParameterSource
- Spring Data JPA @Query nativeQuery ORA-03001: unimplemented feature 錯誤
- java.sql.SQLException: Invalid column name
- Spring Data JPA org.hibernate.AnnotationException: No identifier specified for entity 錯誤原因
- Spring Data JPA SQLSyntaxErrorException: ORA-00904: 無效的 ID invalid identifier
沒有留言:
張貼留言