2011-01-20 8 views
3

に参加する方法:LEFT OUTERとJPAのクエリはこの2つのテーブル(およびそれに対応するエンティティ)に基づいて

私は彼らの項目の最高ランク別に並べられたプロファイルを一覧表示する必要が
profiles(id, email, name) 
items(id, profile_id, rank, price) 

Profile(email, name) 
Item(profile, rank, price) 

が(それはです実際には「トッププロファイル」リスト)。ここで

あなたが例えばPHPMyAdminの中でそれを実行することができますようにSQL要求です:

SELECT AVG(i.rank) AS rank, p.* FROM profiles AS p LEFT OUTER JOIN items AS i ON p.id = i.profile_id GROUP BY p.id ORDER BY rank DESC; 

私はJPAに新たなんだと私はLEFT OUTERがCriteriaBuilderでJOINを行うことについてのいくつかの例を見つけることができない(場合それは正しいことです)。

誰かが私を正しい方法で導いてくれたら、私は本当に感謝しています(私は仕事をしてくれる人に尋ねるのではなく、良い手がかりを持っています)。

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

+0

どのJPA実装を使用していますか?私が覚えている限り、HibernateのJPA 2.0 Criteria APIを介してそのようなクエリを表現することにはいくつか問題があります。 – axtavt

+0

私はPlayを使用しています!フレームワーク(http://www.playframework.org/documentation/1.1/jpa)でも、どのバージョンを使用しているのかはわかりません(理由を聞いているのなら/) –

答えて

7

次のようにこのクエリは、JPQLで表現することができます:あなたはJPAで任意JOIN Sを書き込むことはできません

SELECT p, AVG(i.rank) as rank 
FROM Item i RIGHT JOIN i.profile p 
GROUP BY p 
ORDER BY rank DESC 

注意が、のみJOIN sの関係上、したがって、あなたがここにRIGHT JOINを必要とする、なぜならあなたの関係は一方向であり、関係の元は左側にあるべきです。

このクエリは、JPA 2.0 Criteria APIでかなり簡単に変換できましたが、最後にチェックした時点で、Criteria APIの実装は右ジョインをサポートしていませんでした(そしてPlay Frameworkは下のHibernateを使用します)。ですから、この場合はJPQLクエリを使用する必要があります。

+0

これは完璧です!しかし、EntityManager、CriteriaBuilderなどを使ってJavaを使用することは可能だと思いますか? –

+0

@ cx42net:このクエリは 'EntityManager'を使って実行されます。 'CriteriaBuilder'について - 私は繰り返しますが、うまくいかないでしょう。 – axtavt

+0

ああ、そうです。ご協力いただきありがとうございます :) –

関連する問題