5

我之前问过以下问题: DB2 query Unknown column name ERRORCODE=-4460, SQLSTATE=null

从那以后,我们了解到从 db2jcc.jar (UNIVERSAL) 更改 db2jcc4.jar (JCC) 可以解决我们开发环境中的问题。问题是那个不起作用的是较新的。我们不想在没有真正正当理由的情况下倒退我们的司机。但是上面链接中的查询在新驱动中无效的原因我不明白。

我们知道它是那一列......如果我们通过强制一个空白将它从结果中取出,一切正常(除了我们没有得到数据)。该查询在其他环境中运行良好。

我看到一些帖子暗示此错误与结果集元数据 getColumn() 方法在 JDBC3 和 JDBC4 之间不一致有关。但是我们没有在这个查询中做任何在许多其他查询中没有做的特殊事情,至少据我们所知没有。

有谁知道这个查询可能会引发什么?是否有解决此行为的方法...某些设置或解决方法,或者新的驱动程序?

完整的例外:

com.ibm.db2.jcc.a.SqlException:[jcc][10150][10300][4.3.111] 无效参数:未知>列名 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)在 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) 在 org.hibernate.type.StringType.get(StringType.java:41) 在 org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184) 在 org.hibernate.type.NullableType.nullSafeGet( NullableType.java:210) 在 org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.extract(CustomLoader.java:501) 在 org.hibernate.loader。

4

1 回答 1

6

您可能正在使用 Hibernate 3.x。Hibernate 3.x 尝试通过它们columnName(即列ResultSetMetaData的原始名称的属性)来检索列的值,而 JDBC 要求(按规范)它们是由columnLabelAS别名的属性,或者如果不是)来检索的t 指定了原始列名)。

columnName旧版本的 JDBC 并不完全清楚和之间的区别columnLabel,因此实现驱动程序要么为两个属性返回相同的值,要么期望columnName检索值。

IBM 更改了此行为以符合 DB2 9.5 驱动程序中的 JDBC 规范,请参阅此文档。要恢复到旧行为,您需要将连接属性指定useJDBC4ColumnNameAndLabelSemanticsDB2BaseDataSource.NO(其值为2):

解决
方法 如果您无法更改应用程序以符合新ResultSetMetaData行为,但需要 JDBC 4.0 的其他功能,请将useJDBC4ColumnNameAndLabelSemanticsConnection 或 DataSource 属性设置为DB2BaseDataSource.NO(2) 以保留旧行为。

另一种选择是升级到更新版本的 Hibernate (4.x),因为它(至少默认情况下)使用columnLabel检索值。

于 2013-04-13T07:16:05.003 回答