我有一对一的关系,其中我使用CascadeType.PERSIST。这有一段时间积累还没有被删除,这样的扩展,它体现在性能的子记录一个巨大的数额。 现在,我想添加一些代码来清理数据库中删除所有未由父母所引用的子记录。目前,我们正在谈论400K +的记录,在我需要运行在所有客户安装的代码只是要确保它们不会遇到同样的问题。

我认为最好的解决办法是运行一个命名查询(因为我们支持两个数据库)删除必要的记录,而这正是我进入的问题,因为我应该怎么写呢在JPQL?

我想要的结果可以像下面的SQL语句,unfortunaltely不会在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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top