2010-04-19 82 views
1

我有一對一的關係,我使用CascadeType.PERSIST。隨着時間的推移,這將會產生大量未被刪除的兒童記錄,從而在性能上得到體現。 現在我想添加一些清理數據庫的代碼,刪除所有未被父級引用的子記錄。目前我們正在談論400K +記錄,因爲我需要在所有客戶安裝上運行代碼,以確保它們不會遇到同樣的問題。使用JPA刪除孤兒

我認爲最好的解決方案是運行一個命名查詢(因爲我們支持兩個數據庫),刪除必要的記錄,這是我遇到問題的地方,因爲我應該如何在JPQL中編寫它?

我想要的結果可以像下面的sql語句那樣定義,這種語句不會在MySQL上運行。

DELETE FROM child c1 
WHERE c1.pk NOT IN (SELECT DISTINCT p.pk FROM child c2 
JOIN parent p ON p.child = c2.pk); 

回答

4
DELETE FROM child c 
WHERE NOT EXISTS (SELECT 1 FROM parent WHERE child = c.pk)