Удаление сирот с JPA
-
27-09-2019 - |
Вопрос
У меня есть однозначное отношение, где я использую cascadetype.persist. Это со временем накапливается огромное количество детских записей, которые не были удалены, до такой продливания, что он отражен в производительности. Теперь я хочу добавить некоторый код, который очищает базу данных, удаляя все детские записи, которые не указаны родителем. На данный момент мы говорим 400K + Records, на которых мне нужно запустить код на всех установках клиентов, чтобы убедиться, что они не бегите в ту же проблему.
Я думаю, что лучшее решение будет запустить именованный запрос (потому что мы поддерживаем две базы данных), которые удаляют необходимые записи, и это где я попадаю в проблемы, потому что как я должен написать в 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)