使用 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();
7 row.setId(arg0.getString("ID"));
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。