问题描述
我之前问过以下问题:DB2查询未知列名ERRORCODE=-4460, SQLSTATE=null
我们已经了解到,从 db2jcc4.jar (JCC) 更改为 db2jcc.jar (UNIVERSAL) 可以解决我们开发环境中的问题.问题是那个不起作用的是较新的.我们不想在没有真正正当理由的情况下倒退我们的司机.但是上面链接中的查询在新驱动中无效的原因我不明白.
We have since learned that changing from db2jcc4.jar (JCC) from db2jcc.jar (UNIVERSAL) solves the issue in our development environment. The problem is that the one tha tdoesn't work is the newer one. We don't want to step backwards on our driver without really good cause. But the reason why the query in the above link is invalid in the new driver is not understood by me.
我们知道它就是那一列...如果我们通过强制一个空白将其从结果中取出,一切正常(除了我们没有得到数据).该查询在其他环境中运行良好.
We know it is that column...if we take it out of the results by forcing an empty space, everything works (except we don't get the data). The query works fine in other environments.
我看到一些帖子暗示这个错误与结果集元数据 getColumn() 方法在 JDBC3 和 JDBC4 之间不一致有关.但是我们没有在这个查询中做任何其他查询中没有做的特殊事情,至少据我们所知没有.
I have seen some posts implying that this error is related to the result set meta data getColumn() method being inconsistent between JDBC3 and JDBC4. But we're not doing anything special in this query that isn't being done in many other queries, at least not as far as we can tell.
有谁知道这个查询可能会引起什么问题?是否有解决此问题的方法...一些设置或解决方法,或者新的驱动程序?
Does anyone know what about this query might be setting things off? Is there a fix for this behavior...either some setting or workaround, or a new driver?
完整的例外:
com.ibm.db2.jcc.a.SqlException:[jcc][10150][10300][4.3.111] 无效参数:未知>列名 FILTER_VALUE_DECODE.错误代码=-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)在 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.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 更多
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
别名的属性,或者如果未指定原始列名)检索.
You are probably using Hibernate 3.x. Hibernate 3.x tries to retrieve values of columns by their columnName
(that is the ResultSetMetaData
property for the original name of the column), while JDBC requires (by specification) that they are retrieved by columnLabel
(the property for the AS
alias, or if that isn't specified the original columnname).
旧版本的 JDBC 并不完全清楚 columnName
和 columnLabel
之间的区别,因此实现驱动程序要么为两个属性返回相同的值,要么期望 columnName
和 columnLabel
code>columnName 检索值.
Older versions of JDBC weren't entirely clear about the distinction between columnName
and columnLabel
, so implementing Drivers either returned the same value for both properties, or expected the columnName
to retrieve values.
IBM 更改了此行为以符合 DB2 9.5 驱动程序中的 JDBC 规范,请参阅 本文档.要恢复到旧行为,您需要将连接属性 useJDBC4ColumnNameAndLabelSemantics
指定为 DB2BaseDataSource.NO
(其值为 2
):
IBM changed this behavior to conform to the JDBC specification in the DB2 9.5 driver, see this document. To revert to the old behavior, you need to specify the connection property useJDBC4ColumnNameAndLabelSemantics
to DB2BaseDataSource.NO
(which has the value 2
):
分辨率
如果您无法更改应用程序以符合新的 ResultSetMetaData
行为,但需要 JDBC 4.0 的其他功能,请将 useJDBC4ColumnNameAndLabelSemantics
Connection 或 DataSource 属性设置为 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
来检索值.
The other option is to upgrade to a newer version of Hibernate (4.x) as this (at least by default) uses the columnLabel
for retrieving values.
这篇关于db2jcc4.jar 无效参数:未知列名的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!