Frage

Ich habe eine Eins-zu-Eins-Beziehung, wo ich CascadeType.PERSIST verwenden. Dies hat im Laufe der Zeit Aufbau einer riesigen Menge von untergeordneten Datensätzen, die zu solchen wurde nicht gelöscht, ein erweitern, dass es in der Leistung niederschlägt. Nun wünsche ich einige Code hinzufügen, um die Datenbank zu entfernen alle die untergeordneten Datensätzen bereinigt, die nicht von einem Elternteil referenziert werden. Im Moment sprechen wir 400K + Aufzeichnungen, auf ich den Code auf allen Kunden-Installationen ausführen müssen sicher nur um sie in das gleiche Problem nicht ausgeführt haben.

Ich denke, die beste Lösung eine benannte Abfrage auszuführen wäre (weil wir zwei Datenbanken unterstützen), die die erforderlichen Datensätze löscht, und das ist, wo ich Probleme bekommen, denn wie soll ich es in JPQL schreiben?

Das Ergebnis, das ich will, kann wie die folgenden SQL-Anweisung definiert werden, die unfortunaltely auf MySQL nicht ausgeführt wird.

DELETE FROM child c1
WHERE c1.pk NOT IN (SELECT DISTINCT p.pk FROM child c2
JOIN parent p ON p.child = c2.pk);
War es hilfreich?

Lösung

DELETE FROM child c
WHERE NOT EXISTS (SELECT 1 FROM parent WHERE child = c.pk)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top