我之前问过以下问题:
DB2 query Unknown column name ERRORCODE=-4460, SQLSTATE=null
我们已经了解到,从db2jcc.jar(JCC)更改db2jcc.jar(UNIVERSAL)可以解决我们开发环境中的问题.问题是那些不起作用的是新的.我们不想在没有正当理由的情况下倒退我们的司机.但是我不理解上述链接中的查询在新驱动程序中无效的原因.
我们知道它就是那个专栏…如果我们通过强制一个空的空间把它从结果中取出来,一切都可行(除了我们没有得到数据).该查询在其他环境中工作正常.
我看到一些帖子暗示这个错误与结果集元数据getColumn()方法在JDBC3和JDBC4之间不一致有关.但是我们在这个查询中并没有做任何特殊的事情,而在其他许多查询中都没有这样做,至少在我们所知的情况下并没有这么做.
有谁知道这个查询可能是什么设置?是否有针对此行为的修复程序…某些设置或解决方法,还是新驱动程序?
完整的例外情况:
com.ibm.db2.jcc.a.SqlException: [jcc][10150][10300][4.3.111] Invalid parameter: Unknown >column name FILTER_VALUE_DECODE. ERRORCODE=-4460, SQLSTATE=null
at com.ibm.db2.jcc.a.dd.a(dd.java:660)
at com.ibm.db2.jcc.a.dd.a(dd.java:60)
at com.ibm.db2.jcc.a.dd.a(dd.java:103)
at com.ibm.db2.jcc.a.ib.a(ib.java:1674)
at com.ibm.db2.jcc.a.yl.a(yl.java:1625)
at com.ibm.db2.jcc.a.yl.getString(yl.java:1468)
at com.ibm.ws.rsadapter.jdbc.WSJdbcResultSet.getString(WSJdbcResultSet.java:2467)
at org.hibernate.type.StringType.get(StringType.java:41)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:210)
at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.extract(CustomLoader.java:501)
at org.hibernate.loader.custom.CustomLoader$ResultRowProcessor.buildResultRow(CustomLoader.java:447)
at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:344)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:647)
at org.hibernate.loader.Loader.doQuery(Loader.java:745)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
at org.hibernate.loader.Loader.doList(Loader.java:2294)
… 64 more
解决方法:
你可能正在使用Hibernate 3.x. Hibernate 3.x尝试通过其columnName(即列的原始名称的ResultSetMetaData属性)检索列的值,而JDBC要求(通过规范)它们由columnLabel(AS别名的属性)检索,或者如果没有指定原始列名).
较早版本的JDBC并不完全清楚columnName和columnLabel之间的区别,因此实现Drivers要么为两个属性返回相同的值,要么期望columnName检索值.
IBM将此行为更改为符合DB2 9.5驱动程序中的JDBC规范,请参阅this document.要恢复旧行为,需要将连接属性useJDBC4ColumnNameAndLabelSemantics指定为DB2BaseDataSource.NO(其值为2):
Resolution
If you cannot change your applications to conform to the newResultSetMetaData
behavior but you need other features of JDBC 4.0, set theuseJDBC4ColumnNameAndLabelSemantics
Connection or DataSource property toDB2BaseDataSource.NO
(2) to keep the old behavior.
另一种选择是升级到更新版本的Hibernate(4.x),因为这(至少在默认情况下)使用columnLabel来检索值.