問題描述
我之前問過以下問題: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 無效參數:未知列名的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!