一尘不染

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

hibernate

从那以后,我们了解到,从db2jcc.jar(UNIVERSAL)的db2jcc4.jar(JCC)进行更改可以解决我们开发环境中的问题。问题是不起作用的是较新的一个。如果没有充分的理由,我们不想向后退。但是我不理解以上链接中的查询在新驱动程序中无效的原因。

我们知道那是列…如果我们通过强制使用空格将其从结果中删除,则一切正常(除非我们不获取数据)。该查询在其他环境中运行良好。

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

有谁知道这个查询可能会引起什么事情?是否有针对此行为的修复程序……某些设置或解决方法,或新的驱动程序?

完整的例外:

com.ibm.db2.jcc.a.SqlException:[jcc] [10150] [10300]
[4.3.111]无效的参数:未知>列名FILTER_VALUE_DECODE。错误代码= -4460,SQLSTATE =
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
com.ibm.db2.jcc.a.yl.getString(yl.java:1468)的com.ibm.ws.rsadapter.jdbc.WSJdbcResultSet.getString(WSJdbcResultSet的.a.yl.a(yl.java:1625)
.java:2467),位于org.hibernate.type.StringType.get(StringType.java:41),位于org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184),位于org.hibernate.type.NullableType.nullSafeGet(位于org.hibernate.loader.custom.CustomLoader
$ ScalarResultColumnProcessor.extract(CustomLoader.java:501)处的NULL。


阅读 921

收藏
2020-06-20

共1个答案

一尘不染

您可能正在使用Hibernate3.x。Hibernate3.x尝试按列的值columnName(即列ResultSetMetaData的原始名称的属性)来检索列的值,而JDBC要求(根据规范)要求按列的值columnLabelAS别名的属性来检索),或者如果不是这样的话,t指定原始列名)。

较旧的JDBC版本尚不清楚columnName和之间的区别columnLabel,因此实现Drivers会为两个属性返回相同的值,或者希望columnName可以检索到值。

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

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

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

2020-06-20