2012-02-01 19 views
3

JPA 2.0でCriteria APIを使用するためにネイティブSQLクエリを変換しようとしています。私はGoogleでCriteria APIのサンプルをたくさん見つけましたが、すべてを一緒にまとめるのは本当に苦労しています。経験豊富な人が私を助けてくれることを願っています。ネイティブクエリは次のようになります。JPA CriteriaBuilderとの和和と和

select 
    sum(amount) from firstTable, secondTable 
     where firstTable.id = secondTable.id 
      and amount <> 0 
      and firstTable.id = ? 
union all 
select 
    sum(amount) from firstTable, thirdTable 
     where firstTable.id = thirdTable.id 
      and amount <> 0 
      and firstTable.id = ? 

元のクエリ結果セットは、BigDecimalオブジェクトのListを返していました。

ありがとうございました!

答えて

6

JPAはUNIONをサポートしていないため、ネイティブSQLクエリを使用するか、2つのクエリを実行します。

+1

なぜUNIONがサポートされていないのですか? – santedicola

+2

EclipseLinkはUNIONをサポートしていますhttp://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#UNION – James

2

次の例で申し訳ありませんが、それはかなりの参加で、労働組合ではありません。

私は複数のルートでクエリを使用して検討します。ここ

がHiberante開発者ガイドからの抜粋であり、コードがJPA 2.0互換です。

基準クエリは、新しく追加されたルートと他の間でデカルト積を作成することである効果れた、複数のルートを定義することができます。ここでは、すべての単一の男性とすべての独身女性をマッチング例です。

CriteriaQuery query = builder.createQuery(); 
Root<Person> men = query.from(Person.class); 
Root<Person> women = query.from(Person.class); 
Predicate menRestriction = builder.and(
     builder.equal(men.get(Person_.gender), Gender.MALE), 
     builder.equal(men.get(Person_.relationshipStatus), RelationshipStatus.SINGLE) 
); 
Predicate womenRestriction = builder.and(
     builder.equal(women.get(Person_.gender), Gender.FEMALE), 
     builder.equal(women.get(Person_.relationshipStatus), RelationshipStatus.SINGLE) 
); 
query.where(builder.and(menRestriction, womenRestriction)) 
+0

select節はどのように表示されますか?選択した列をフェッチするためにcriteriaBuilder.constructを使用しています。 – user613114

+0

〜@ user613114:私はORMとJavaを数年間使っていませんが、私は答えようとします。 上記の例は、男と女の可能な組み合わせをすべて示します。 SQLクエリは次のようになります。 PERSONSどこからa.gender =「男性」とb.gender =「女性」とB、PERSONSをa.name b.nameを選択します。status = singleおよびb.status = single – Alex

1

あなたは連合のすべてが必要な場合は、2つのエンティティが私の心にそれらに継承を適用​​する候補です。

0

Marcinが指摘しているように、少なくとも特殊なケースでは継承が可能です。

TABLE_PER_CLASS継承戦略を使用してクエリされたエンティティを別のものから継承させることができます(オプションで休止状態で可能ですが、IDENTITYとAUTOは使用できません)。両方のエンティティで同じ名前を使用すると、親エンティティを照会することによって両方のエンティティを結合できます。例えば

エンティティクラスの子がエンティティクラスの親フィールド「名前」の両方から延びている場合、クエリは次のようになります。

親エンティティの名前のみを選択するには、親のp

からp.nameを選択、追加タイプはTYPEです。

別のものを継承するエンティティを変更することが不適切である場合TYPE(p)が親会社

を=、このクエリのために(原因の継承、と)特別なものを作成することができ、親pから選択p.name、以来、同じテーブルに対して複数のエンティティを作成することは可能です。しかし、あなたはその努力が合理的であるとは思わないでしょう。