2010-04-19 3 views
1

J'ai une relation un-à-un où j'utilise CascadeType.PERSIST. Cela a au fil du temps accumulé une énorme quantité d'enregistrements enfants qui n'ont pas été supprimés, à tel point que cela se reflète dans la performance. Maintenant, je souhaite ajouter du code qui nettoie la base de données en supprimant tous les enregistrements enfants qui ne sont pas référencés par un parent. En ce moment nous parlons des enregistrements 400K +, je dois exécuter le code sur toutes les installations des clients juste pour être sûr qu'ils ne rencontrent pas le même problème.Suppression des orphelins avec JPA

Je pense que la meilleure solution serait d'exécuter une requête nommée (parce que nous supportons deux bases de données) qui supprime les enregistrements nécessaires, et c'est là que je rencontre des problèmes, comment l'écrire en JPQL?

Le résultat que je veux peut être défini comme l'instruction sql suivante, qui ne fonctionne malheureusement pas sur 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); 

Répondre

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