spring中ora-00904:无效列名解决

今天遇到一个很奇怪的问题,用spring中的getJdbcTemplate().query(sql,RowCallbackHandler)的方式执行查询,在查询字段使用distinct就会报ora-00904:无效列名解决错误(配置链接的是oracle 11g)。

解决过程:
首先将执行的sql打印出来为:select distinct(url) from book_store where id >100,在pl sql中执行没有问题。说明错误可能是在产生结果arraylist的时候出现的。但是在spring的代码中调试了半天,始终显示正确的sql是传入到java.net.sql中的statement.excute()执行的。但是返回结果为空,无法再进一步跟踪调试。
于是我抛开spring,直接通过oracle jdbc使用同样的sql查询,发现用result.getString("url")才能取到正确的结果,而在spring中实际是将distinct(url)作为字段名传入到结果集中的。于是我将查询函数改成下面这样:

getJdbcTemplate().query(sql, new RowCallbackHandler() {
public void processRow(java.sql.ResultSet rs) throws SQLException {
HashMap<String, String> lineResult = new HashMap<String, String>();
for(int i=0; i<columns.size();i++) {
if(columns.get(i).indexOf("(")!=-1) {
columns.set(i, columns.get(i).substring(columns.get(i).indexOf("(")+1,columns.get(i).indexOf(")")));
CrawlReporter.printLogger.info(columns.get(i));
}
lineResult.put(columns.get(i), rs.getString(columns.get(i)));
}
results.add(lineResult);
}
});


这样替换了字段名后就能取到正确的值了,这应该算是spring的一个小bug吧。应该像jdbc中取结果集一样自动选择正确的列名,避免出现这种莫名奇妙的错误,还不容易调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值