2

Hibernate Native Query を使用して DB2 CHAR フィールドからデータをフェッチしているときに、次の問題に直面しています。

次のようなテーブル構造とデータがあります。

 CNTRL_4 COLUMN_ID PARAM
 ------- --------- --------------------
       1         1 10                  
       1         2 12                  
       1         3 true                
       2         1 10                  
       2         2 13                  
       2         3 false               
       3         1 10                  
       3         2 16                  
       3         3 true                

CNTRL_4 と COLUMN_ID は数値ですが、PARAM は CHAR(10) です。次のクエリを手動で (Eclipse SQL プラグインから) 実行すると、適切な結果が取得されます。

SELECT CNTRL_4, COLUMN_ID, VALUE AS PARAM FROM MY_TABLE_NAME 

しかし、Java コード (Hibernate Native Query) で同じクエリを実行すると、次の結果が得られます。

[{CNTRL_4=1, COLUMN_ID=1, PARAM=1}, 
 {CNTRL_4=1, COLUMN_ID=2, PARAM=1}, 
 {CNTRL_4=1, COLUMN_ID=3, PARAM=t}, 
 {CNTRL_4=2, COLUMN_ID=1, PARAM=1}, 
 {CNTRL_4=2, COLUMN_ID=2, PARAM=1}, 
 {CNTRL_4=2, COLUMN_ID=3, PARAM=f}, 
 {CNTRL_4=3, COLUMN_ID=1, PARAM=1}, 
 {CNTRL_4=3, COLUMN_ID=2, PARAM=1}, 
 {CNTRL_4=3, COLUMN_ID=3, PARAM=t}]

PARAMデータを見てください。最初の文字だけです。

次のJavaコードを使用しています

String sql = "SELECT CNTRL_4, COLUMN_ID, VALUE AS PARAM FROM MY_TABLE_NAME";
SQLQuery query = hibernateUtil.getCurrentSession().createSQLQuery(sql);
query.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List<Map<String, Object>> data = (List<Map<String, Object>>) query.list();
System.out.println(data);

Google でも検索したところ、このブログ投稿が見つかりました。これは私の問題と同じです。覚えている限り、SQLクエリで型キャストすることでこの問題を解決しました。しかし、今は自分がしたことを忘れてしまい、今では解決できません。

助けてください。

更新: 型キャストによって解決された問題。私の答えを見てください。

4

2 に答える 2

4

型キャストにより、次のように問題を解決できます

SELECT CNTRL_4, COLUMN_ID, RTRIM(CAST (VALUE AS VARCHAR(10))) AS PARAM FROM MY_TABLE_NAME 

説明:

VALUE 列は DB2 で CHAR として定義されており、Hibernate はトランス Criteria.ALIAS_TO_ENTITY_MAPを使用してフィールドのタイプをチェックしているため、データを Charecter にキャストしています。したがって、最初の文字のみが返されます。

しかし、選択中にタイプをVARCHARに変更すると、私の問題は解決されます。

デメリットがあれば教えてください。

于 2015-12-02T07:38:39.440 に答える
2

トランスフォーマーなしで試してください。クエリを次のように変更してください。

String sql = "SELECT CNTRL_4, COLUMN_ID, VALUE AS PARAM FROM MY_TABLE_NAME";
SQLQuery query = hibernateUtil.getCurrentSession().createSQLQuery(sql);
List data = query.list();
System.out.println(data);

falseこれは、基になる DB2 ドライバーにクエリを渡すだけなので、DB2 ドライバーが値を文字列として認識しない限り、機能するはずです。

于 2015-12-01T11:46:14.337 に答える