使用JPA删除孤儿

时间:2010-04-19 08:15:05

标签: java jpa jpql named-query

我有一对一的关系,我使用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);

1 个答案:

答案 0 :(得分:4)

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