一千萬個為什麽

搜索

使用JPA刪除孤兒

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

我認為最好的解決方案是運行一個命名查詢(因為我們支持兩個數據庫)來刪除必要的記錄,這就是我遇到問題的地方,因為我應該如何在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);

最佳答案

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

轉載註明原文: 使用JPA刪除孤兒