2010-04-19 4 views
1

У меня есть взаимно однозначное отношение, где я использую CascadeType.PERSIST. Это со временем создает огромное количество дочерних записей, которые не были удалены, до такой степени, что это отражается в производительности. Теперь я хочу добавить код, который очищает базу данных, удаляя все дочерние записи, на которые не ссылается родитель. На данный момент мы говорим записи 400K +, мне нужно запустить код на всех установках клиента, чтобы убедиться, что они не сталкиваются с той же проблемой.Удаление сирот с JPA

Я думаю, что лучшим решением было бы запустить именованный запрос (потому что мы поддерживаем две базы данных), который удаляет необходимые записи, и именно здесь я сталкиваюсь с проблемами, потому что как я должен писать его в 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); 

ответ

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