`
cxmin121
  • 浏览: 18957 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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中取结果集一样自动选择正确的列名,避免出现这种莫名奇妙的错误,还不容易调试。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics