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 つありますが、どれも完全に満足できるものではありません。
- バージョン 3.x ドライバーを使用します。
- で通話
getColumnLabel
に切り替えることができResultSetMetaData
ます。これにより、バージョン 4 以降のドライバーを使用する DB2 LUW で正しい結果が得られます。これは問題の私たちのバージョンに当てはまりますが、Hibernate 経由では関係がないか、可能でない可能性があります。
DataSource
またはConnection
オブジェクトに設定できるプロパティがあります。useJDBC4ColumnNameAndLabelSemantics
に設定する必要がありますDB2BaseDataSource.NO
。ただし、Hibernate 経由で設定できるかどうかはわかりません。可能であれば、エイリアスが古い(そして適切な)方法で動作するようにする必要があります。
私たちの環境では、これに対処する最善の方法をまだ決定していません。現時点では、オプション 1 を使用して回避しています。私はオプション 2 を使用する傾向がありますが、複数の DB プラットフォームをサポートする必要があり、他のプラットフォームとどのように連携するかはわかりません。オプション 3 では、Spring を使用しているため、そのプロパティを設定するのは現実的ではない場合があります。