我之前问过以下问题: 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]无效参数:未知>列名FILTER_VALUE_DECODE。 ERRORCODE = -4460,SQLSTATE = null 在com.ibm.db2.jcc.a.dd.a(dd.java:660) 在com.ibm.db2.jcc.a.dd.a(dd.java:60) 在com.ibm.db2.jcc.a.dd.a(dd.java:103) 在com.ibm.db2.jcc.a.ib.a(ib.java:1674) 在com.ibm.db2.jcc.a.yl.a(yl.java:1625) 在com.ibm.db2.jcc.a.yl.getString(yl.java:1468) 在com.ibm.ws.rsadapter.jdbc.WSJdbcResultSet.getString(WSJdbcResultSet.java:2467) at org.hibernate.type.StringType.get(StringType.java:41) 在org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184) 在org.hibernate.type.NullableType.nullSafeGet(NullableType.java:210) at org.hibernate.loader.custom.CustomLoader $ ScalarResultColumnProcessor.extract(CustomLoader.java:501) 在org.hibernate.loader.custom.CustomLoader $ ResultRowProcessor.buildResultRow(CustomLoader.java:447) 在org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:344) 在org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:647) 在org.hibernate.loader.Loader.doQuery(Loader.java:745) 在org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270) 在org.hibernate.loader.Loader.doList(Loader.java:2294) ......还有64个
答案 0 :(得分:5)
您可能正在使用Hibernate 3.x. Hibernate 3.x尝试按columnName
(即列的原始名称的ResultSetMetaData
属性)检索列的值,而JDBC要求(按规范)它们由{{{ 1}}(columnLabel
别名的属性,或者如果没有指定原始列名,则为。}
较早版本的JDBC并不完全清楚AS
和columnName
之间的区别,因此实现驱动程序要么为两个属性返回相同的值,要么预期columnLabel
检索价值。
IBM将此行为更改为符合DB2 9.5驱动程序中的JDBC规范,请参阅this document。要恢复旧行为,您需要将连接属性columnName
指定为useJDBC4ColumnNameAndLabelSemantics
(其值为DB2BaseDataSource.NO
):
决议
如果您无法更改应用程序以符合新的2
行为但需要JDBC 4.0的其他功能,请将ResultSetMetaData
Connection或DataSource属性设置为useJDBC4ColumnNameAndLabelSemantics
(2)以保持旧行为。
另一种选择是升级到更新版本的Hibernate(4.x),因为这(至少在默认情况下)使用DB2BaseDataSource.NO
来检索值。