Pregunta

I tiene una relación uno-a-uno donde uso CascadeType.PERSIST. Esto tiene más tiempo construir una enorme cantidad de registros secundarios que no se ha eliminado, hasta tal punto que se extienden se refleja en el rendimiento. Ahora me gustaría añadir algo de código que limpia la base de datos de eliminación de todos los registros secundarios que no están referenciados por un padre. Por el momento estamos hablando 400K + registros, por lo que necesito para ejecutar el código en todas las instalaciones de los clientes sólo para estar seguro de que no se ejecutan en el mismo problema.

creo que la mejor solución sería la de ejecutar una consulta con nombre (porque apoyamos dos bases de datos) que elimina los registros necesarios, y aquí es donde me meto en problemas, porque ¿cómo debería escribirlo en JPQL?

El resultado que quiero se puede definir como la siguiente instrucción SQL, que unfortunaltely no se ejecuta en 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);
¿Fue útil?

Solución

DELETE FROM child c
WHERE NOT EXISTS (SELECT 1 FROM parent WHERE child = c.pk)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top