Question

J'ai une à une relation où j'utilise CascadeType.PERSIST. Cela a surdimensionnez temps une énorme quantité de dossiers d'enfants qui n'a pas été supprimé, à une telle extension qu'elle se reflète dans la performance. Maintenant, je voudrais ajouter un code qui nettoie la base de données supprimant tous les enregistrements enfants qui ne sont pas référencées par un parent. Actuellement, nous parlons 400K + dossiers, à je dois exécuter le code sur toutes les installations du client juste pour être sûr qu'ils ne fonctionnent pas dans le même problème.

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

Le résultat que je veux peut être défini comme l'instruction SQL suivante, qui ne unfortunaltely fonctionne 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);
Était-ce utile?

La solution

DELETE FROM child c
WHERE NOT EXISTS (SELECT 1 FROM parent WHERE child = c.pk)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top