【问题标题】:db2jcc4.jar Invalid parameter: Unknown column namedb2jcc4.jar 无效参数:未知列名
【发布时间】:2013-04-05 14:12:14
【问题描述】:

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

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

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

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

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

完整的例外:

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 更多

【问题讨论】:

  • 如果您解决了旧问题,请发布答案,以防其他人遇到类似问题。
  • 我的猜测是您使用 columnName 而不是 columnLabel 从结果集中检索值。
  • @WarrenT - 不,这是更多细节/重新询问该问题。马克的回答看起来很有希望。我要试试。

标签: java hibernate jdbc db2


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-03
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多