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