5

以前に次の質問をしました: DB2 クエリ 不明な列名 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。ERRORCODE=-4460、com.ibm.db2.jcc.a.dd.a(dd.java:660) で com.ibm.db2.jcc.a.dd.a(dd.java:60) で SQLSTATE=null 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) の .a.yl.a(yl.java:1625) 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 では (仕様により) (エイリアスcolumnLabelのプロパティ、またはそうでない場合) によって値を取得する必要があります。 ASt は元の列名を指定しました)。

columnName古いバージョンの JDBC では、との区別が完全に明確ではなかったcolumnLabelため、ドライバを実装すると、両方のプロパティに対して同じ値が返されるか、 がcolumnName値を取得することが期待されていました。

IBM は、DB2 9.5 ドライバーの JDBC 仕様に準拠するようにこの動作を変更しました。このドキュメントを参照してください。useJDBC4ColumnNameAndLabelSemantics古い動作に戻すには、接続プロパティをDB2BaseDataSource.NO(値は2)に指定する必要があります。

解決策
新しい動作に準拠するようにアプリケーションを変更できないがResultSetMetaData、JDBC 4.0 の他の機能が必要な場合は、useJDBC4ColumnNameAndLabelSemanticsConnection または DataSource プロパティをDB2BaseDataSource.NO(2) に設定して古い動作を維持します。

もう 1 つのオプションは、新しいバージョンの Hibernate (4.x) にアップグレードすることです。これは (少なくともデフォルトでは) を使用してcolumnLabel値を取得するためです。

于 2013-04-13T07:16:05.003 に答える