Domanda

Ho una relazione uno-a-uno dove io uso CascadeType.PERSIST. Questo ha nel tempo costruire una quantità enorme di record figlio che non è stato eliminato, in tale estensione che si riflette nella performance. Ora desidero aggiungere del codice che pulisce il database eliminando tutti i record figlio, che non si fa riferimento da un genitore. Al momento stiamo parlando 400K + record, a ho bisogno di eseguire il codice su tutte le installazioni dei clienti solo per essere sicuri che non corrono lo stesso problema.

Credo che la soluzione migliore sarebbe quella di eseguire una query di nome (perché sosteniamo due database) che elimina i record necessari, ed è qui che mi trovo in problemi, perché come dovrei scriverlo in JPQL?

Il risultato che voglio può essere definita come la seguente istruzione SQL, che unfortunaltely non funziona su 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);
È stato utile?

Soluzione

DELETE FROM child c
WHERE NOT EXISTS (SELECT 1 FROM parent WHERE child = c.pk)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top