2011-07-06 5 views
2

にSQLクエリを翻訳:クエリ後JPQL

SELECT kinder.kindID, kinder.kindName, kinder.kindVorname 
FROM kinder 
INNER JOIN (SELECT kindName FROM kinder 
    GROUP BY kindName HAVING count(kindID) > 1) dup ON kinder.kindName = dup.kindName 
ORDER BY kindName 

発見して表示するには私のMySQLのDBからの候補を複製します。
これまでJPQLに翻訳するのに助けが必要でした。

+0

JPQLを使用する必要はありますか?ネイティブSQLはオプションではありませんか? –

+0

私はそれが怖いです。問合せは、任意のDBMSで操作可能でなければならないJavaアプリケーション内から実行する必要があります。したがって、ネイティブSQLはありません。 –

+0

少なくとも、このクエリで必要とされるものについては、SQLはかなり標準的です。私は、このクエリは任意のDBMSで動作すると思います。 –

答えて

1

私はちょうど実験していましたが、JBと同じソリューションを考え出しました。これはWebSphereのOpenJPAで実行されます。

SELECT k.id, k.name, k.vorname from Kinder k where 
     k.name IN (
     SELECT dup.name FROM Kinder dup 
      GROUP BY dup.name HAVING count(dup.id) > 1) 
+0

JBが投稿したのと同じ解決法ですか?私はそれがかなり正しいと思ったが、それはEclipseでコンパイルしなかった。私は最後にネイティブSQLに固執しました。これは約50〜60件のJPQLクエリを持つプロジェクト内の唯一のネイティブSQLクエリですが、それはその仕事をします。しかし、それは私にそれをもう一度試してくれる。私はそれが動作する場合スレッドを投稿しておきます。 –

+0

通常、 'COUNT(DISTINCT dup.id)'を使います。 'COUNT(dup.id)'は 'COUNT(*)'と等価です( 'dup.id'はNULLを持つことができない限り) –

0

サブクエリはJPQLに許可されている場合、私はよく分からないが、あなたのクエリ:

SELECT kinder.kindID, kinder.kindName, kinder.kindVorname 
FROM kinder 
    INNER JOIN 
    (SELECT kindName 
     FROM kinder 
     GROUP BY kindName 
     HAVING count(kindID) > 1 
    ) dup 
    ON kinder.kindName = dup.kindName 
ORDER BY kinder.kindName 

EXISTSを使用して(IN方法以外に)書き込むことができます。

SELECT k.kindID, k.kindName, k.kindVorname 
FROM kinder k 
WHERE EXISTS 
     (SELECT * 
     FROM kinder k2 
     WHERE k2.kindName = k.kindName 
      AND k2.kindID <> k.kindID 
    ) 
ORDER BY k.kindName 

か使用:ANY

SELECT k.kindID, k.kindName, k.kindVorname 
FROM kinder k 
WHERE k.kindID <> ANY 
     (SELECT k2.kindID 
     FROM kinder k2 
     WHERE k2.kindName = k.kindName 
    ) 
ORDER BY k.kindName 
+0

月曜日の朝にこれらを試してみます。ありがとう。 –

関連する問題