db2jcc4.jar参数无效:未知列名

时间:2013-04-12 22:14:41

标签: java hibernate jdbc db2

我之前问过以下问题: 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个

1 个答案:

答案 0 :(得分:5)

您可能正在使用Hibernate 3.x. Hibernate 3.x尝试按columnName(即列的原始名称的ResultSetMetaData属性)检索列的值,而JDBC要求(按规范)它们由{{{ 1}}(columnLabel别名的属性,或者如果没有指定原始列名,则为。}

较早版本的JDBC并不完全清楚AScolumnName之间的区别,因此实现驱动程序要么为两个属性返回相同的值,要么预期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来检索值。