2017-07-09 12 views
0

複数のジョインを持つ2つの大きなSQLクエリーがあり、それらを単一のリストにマージしてDAOクラスにキャストしようとしましたが、成功しませんでした。私のクエリのHERESに簡単な例:2つのHibernate SQLクエリーのリストをマージする

String sql_comp = "select cs.identification as id from code_system"; 
Query q = session.createSQLQuery(sql_comp) 
       .addScalar("id", StandardBasicTypes.LONG) 
       .setResultTransformer(Transformers.aliasToBean(FHIR_Parameters.class)); 
List list = q.list(); 

String sql_comp2 = "select vs.identification as id_2 from value_set"; 
Query q2 = session.createSQLQuery(sql_comp2) 
       .addScalar("id_2", StandardBasicTypes.LONG) 
       .setResultTransformer(Transformers.aliasToBean(FHIR_Parameters.class)); 
List list_2 = q2.list(); 

私はすでに様々な方法を試してみましたが、私に次のような方法により、最も成功を約束しています

List result = new ArrayList(); 
result.addAll(list); 
result.addAll(list_2); 
fhir_codesystem = (FHIR_Parameters) result.get(0); 

をしかし、最終的なキャストは常に最初のリストが含まれています。

誰かが私が間違っているアイデアですか?今までありがとう。

更新#1:

[OK]を、私のアプローチは愚かだった(私は要素ではなく、リストをマージしたかった...)としてウィーゲッター/セッターを、それを解決したことを実現した、ありがとうございました次のようになります。

FHIR_Parameters fhir_codesystem_2 = (FHIR_Parameters) list_2.get(0); 
fhir_codesystem.setVs_Id(fhir_codesystem_2.getVs_Id()); 

私の質問はまだ解決していないのですか?私は古い要素の上に新しい要素を置き、空の属性を埋めることができますか?

+0

あなたは2つのリストが空ではないと確信していますか? list.size()、list_2.size()およびresult.size()は何を返しますか? –

+0

はい、リスト1のサイズは21、リスト2は22です。これは実際にシーケンスに依存します。 "list_2"を最初に追加したときに、 "list_2"の項目を解析すると、 "list_2"を最初に追加したときに、 "list"の項目を解析するときに "list"を追加するとき – MavidDeyers

+0

なぜ:fhir_codesystem =(FHIR_Parameters)result.get(0); ??あなたは要素ではないリストが必要ですか? result.get(0)は結果リストの最初の要素を返すので、 –

答えて

1

実際に期待される動作を記述しています。リストは順序付けされているので、最初に結果に "list"を追加すると、 "list"のアイテムが常に最初になります。 result.get(0)を検査しているとき。 - これは常にあなたが最初に追加したリストの最初のアイテムになります。

マージされたリストが必要なので、クエリメソッドからListを返す必要があります。単一のFHIR_Parametersエンティティではありません。

編集のための編集で!

リンクされたハッシュマップはあなたを助けてくれるでしょう(必要な場合は注文を保存します)。私が投稿する前にこれをテストしていない謝罪だが、おそらくこれが助けになるだろうか?

final Map<Long, FHIR_Parameters> myMap = new LinkedHashMap<>(); 
for (FHIR_Parameters fhir1 : list) { 
    myMap.put(fhir.getId(), fhir); 
} 
for (FHIR_Parameters fhir2 : list) { 
    if (myMap.containsKey(fhir2.getId()) { 
     final FHIR_Parameters fhir1 = myMap.get(fhir2.getId); 
     //// do somthing to fhir1 (perhaps update from fhir2?) 
    } else { 
     // do something else, if you want to merge then: 
     myMap.put(fhir2.getId(), fhir); 
    } 
} 
final List<FHIR_Parameters> mergedList() = new ArrayList<>(); 
for (Long id : myMap.keySet()) { 
    merged.add(myMap.get(id)); 
} 
+0

あなたは正しいです、私は間違った道にいて、私の問題を今解決することができました。 Imはもっと良い解決策があるかどうか自分に尋ねるので、新しい要素を古い要素に置き、空の属性を埋めることができます。 – MavidDeyers

+0

心配する必要はありません - 私はあなたの編集に応じて私の答えを更新しました。これはあなたが必要とする行に沿っていると思います。そして、私はあなたがすでにそれを解決したことに気づいた(doh!) - しかし、とにかく助けてくれることを願っています。 – GrumpyWelshGit

関連する問題