2011-07-06 187 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數據庫的候選人。
現在我需要幫助翻譯它到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

星期一早上我會試試這些。謝謝。 –