又犯了一個錯誤。
爭取沒有下次了。
就算再犯,也要知道去哪找答案。
所以,記錄一下,以示警戒。
報錯
使用 JdbcTemplate 查詢數據時,出現異常:
PreparedStatementCallback; bad SQL grammar [--sql--]; nested exception is java.sql.SQLException: 列名無效
代碼大致如下:
1 List<SomeObj> list = getJdbcTemplate().query(sql, 2 new RowMapper() { 3 public Object mapRow(ResultSet arg0, int arg1) 4 throws SQLException { 5 SomeObj row = new SomeObj(); 6 7 row.setId(arg0.getString("ID")); 8 9 return row; 10 } 11 });
找錯
既然是 列名無效,肯定是SQL的問題了。
於是,把SQL貼到PL/SQL 中執行,奇怪,沒有報錯。
反復試了幾次,都是程序報錯,但直接執行SQL沒問題。
想起之前由於參數個數的問題,遇到過這樣的異常:java.sql.SQLException: 無效的列索引 。
於是又檢查了一遍參數,沒有問題。
只能上網找找答案了。
搜了幾篇文章,沒找到和這個類似的問題。
看着看着,忽然想到,SQL中查詢的列,和Java代碼中要獲取的列一致么?
原來是這樣
出現異常的原因找到了:在Java代碼中用到的列,SQL中沒有查詢。
即,Java中用到了類似這樣的代碼: row.setId(arg0.getString("COL_A")) ,而SQL中的 SELECT 語句中沒有 COL_A 這一列。
后記:這是調整之前已有的代碼,去掉了一些不必要的列,所以才導致SQL和后面需要取值的列不一致。
新開發的話,應該不會出現這個問題。
因為,這類應用,一般都是確定了需要哪些列,然后再去組裝SQL。