2

Hibernate とデータベース用の IBM DB2 9.7 LUW を使用して Java アプリケーションを作成しています。SQLQuery API を使用して、カスタム SQL クエリ文字列を読み取り、DB に対して実行しています。例として、クエリにはエイリアスが含まれていますSELECT WORK.EMPLOYEE AS WORKEMPLOYEE

list()コマンドを使用して DB から結果セットを取得すると、結果mapにエイリアスがキーとして含まれません。したがって、書き込みは をmap.containsKey("WORKEMPLOYEE")返しますfalse。私も使ってみquery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE)ましたが状況は変わりませんでした。

4

1 に答える 1

0

Hibernate についてはわかりませんが、これは DB2 LUW とエイリアスに関して見られた問題の症状であると思われます。

これは、列の「名前」とその「ラベル」の違いに関連しています。IBM は、このページで動作を文書化しています。これは、動作がデータベース ドライバーのバージョンによって異なることを示唆しています。

具体的には、この段落:

クエリの SELECT リスト内の列に AS 句があるかどうか。IBM Data Server Driver for JDBC and SQLJ バージョン 4.0 より前の JDBC ドライバーの場合、照会の SELECT リスト内の列に AS 節が含まれている場合、ResultSetMetaData.getColumnName は AS 節の引数を返します。IBM Data Server Driver for JDBC and SQLJ バージョン 4.0 では、ResultSetMetaData.getColumnName はテーブルの列名を返します。

バージョン 4 以降のドライバーを使用しているため、あなた (および私) が問題があると見なす動作が見られることを示唆しています。

考えられる解決策は 3 つありますが、どれも完全に満足できるものではありません。

  1. バージョン 3.x ドライバーを使用します。
  2. で通話getColumnLabelに切り替えることができResultSetMetaDataます。これにより、バージョン 4 以降のドライバーを使用する DB2 LUW で正しい結果が得られます。これは問題の私たちのバージョンに当てはまりますが、Hibernate 経由では関係がないか、可能でない可能性があります。
  3. DataSourceまたはConnectionオブジェクトに設定できるプロパティがあります。useJDBC4ColumnNameAndLabelSemanticsに設定する必要がありますDB2BaseDataSource.NO。ただし、Hibernate 経由で設定できるかどうかはわかりません。可能であれば、エイリアスが古い(そして適切な)方法で動作するようにする必要があります。

私たちの環境では、これに対処する最善の方法をまだ決定していません。現時点では、オプション 1 を使用して回避しています。私はオプション 2 を使用する傾向がありますが、複数の DB プラットフォームをサポートする必要があり、他のプラットフォームとどのように連携するかはわかりません。オプション 3 では、Spring を使用しているため、そのプロパティを設定するのは現実的ではない場合があります。

于 2014-11-11T11:48:25.723 に答える