今天要做一个功能,是“根据税务机关查询关联的行政区划”,其中行政区划要以树形结构展示,倒不是很难,但是出了问题,查询行政区划的时候一直不显示,后台一直报错。
我的编程环境是:
数据库:oracle 10g
数据库工具:pl/sql
语言:java1.6
编程工具:MyEclipse 6
服务器软件:jboss4.0.2
查询代码如下:
……
String strSql ="select m.xzqh_dm ,m.xzqh_mc ,m.xzqh_jb
decode(tt.swjg_dm,null,'0','1') ischecked " +
"from
t_xt_xzqh m, (select t.swjg_dm,t.xzqh_dm from t_xt_xzqh_gl t where
t.swjg_dm= ?) tt " +
"where
m.sjxzqh_dm = ? and m.xzqh_dm = tt.xzqh_dm(+) order by m.xzqh_dm asc;";
SQLQuery query =
session.createSQLQuery(strSql);
query.setParameter(0,swjgdm);
query.setParameter(1,parentid);
……
结果执行的时候后台一直报错:
2014-09-10 14:31:55,437 WARN [org.hibernate.util.JDBCExceptionReporter] SQL Error: 911,
SQLState: 42000
2014-09-10 14:31:55,437 ERROR
[org.hibernate.util.JDBCExceptionReporter] ORA-00911: 无效字符
2014-09-10 14:31:55,437 DEBUG [org.hibernate.jdbc.JDBCContext]
after autocommit
2014-09-10 14:31:55,437 DEBUG
[org.hibernate.jdbc.ConnectionManager] aggressively releasing JDBC
connection
2014-09-10 14:31:55,437 DEBUG
[org.hibernate.jdbc.ConnectionManager] releasing JDBC connection [
(open PreparedStatements: 0, globally: 0) (open ResultSets: 0,
globally: 0)]
2014-09-10 14:31:55,437 DEBUG
[org.hibernate.connection.DriverManagerConnectionProvider]
returning connection to pool, pool size: 1
2014-09-10 14:31:55,437 WARN [org.apache.struts.chain.commands.AbstractExceptionHandler]
Unhandled exception
org.hibernate.exception.SQLGrammarException: could not execute
query
……
开始我还以为是sql语句中的“?”影响到了sql语句的执行,就把“?”换成了相应的参数,可是还是报同样的错误,但是sql语句复制到pl/sql里执行确实不会报错的,可以正常的查询出来。这下我就蒙了。前前后后查询了好几遍代码,没有发现错误。
就这个问题上,纠结了一个小时左右,突然我发现了个问题,我写的sql语句是要传到hibernate里执行的,我上面那句sql语句因为是从pl/sql查询出结果复制过来的,所以多了个“;”。想到这,我就把上面sql语句最后的“;”去掉,果然问题就解决了。
最后得到的结论是“有时候是我们把问题想得太简单了,而有的时候我们又把问题想得太复杂了!”