2011-01-28 7 views
2

私はかなりSQLに精通していますが、Java Persistence APIについては非常に新しいです。私はPlay Frameworkを通じてJPAを使用しています。このMySQLクエリをJPAに変換できますか?

I持って、私は私ができるならば、純粋なJPAコードに変換したいのですが、次のMySQLのクエリ:

SELECT a.id, b.id 
FROM Rankable a 
INNER JOIN Rankable b on a.id < b.id 
WHERE 
    a.category_id = ? AND b.category_id = ? 
    AND NOT EXISTS (
    SELECT * 
    FROM Comparison c 
    WHERE c.lower in (a.id, b.id)) 
    AND NOT EXISTS (
    SELECT * 
    FROM Comparison c 
    WHERE c.higher IN (a.id, b.id)) 
ORDER BY a.id * rand() 
LIMIT 1; 

このクエリの目的は、Rankableテーブルから2つの行を選択し、それを確保することですこの特定のペアは、比較表には存在しません。

Play/JPAからこのようなやや複雑なクエリを呼び出すにはどうすればよいでしょうか?

+0

this example

を見てみましょうクエリはかなりそれはJPAの場合と同じに見えます。私がそこに見る唯一の疑問のあるものは "rand()"と "LIMIT"です。自然に "?"パラメータ(:param1など)のための別の構文に置き換えなければなりません。それ以外の問題は何ですか? –

+0

これで、JPA相当のrand()とlimitが何であるかを調べることができます。もう1つの質問は、JPAクエリ(JPA.em()。createQuery(query)を使用)を実行すると、(行は既存のクラスに対応しないため)結果を取り出すにはどうすればよいですか? – sanity

+0

クエリで 'ORDER BY a.id * rand()'の目的は何ですか? – Behrang

答えて

1

JPAで自己結合を行うことは可能です。

は一見の例から

@NamedQuery(name="siblings", query="select distinct sibling1 " 
    + "from Deity sibling1, Deity sibling2 where " 
    + "sibling1.father = sibling2.father " 
    + "and sibling1.mother = sibling2.mother " 
    + "and sibling2 = ?1 and sibling1 <> ?1"), 
関連する問題