Pergunta

Eu tenho uma relação individual em que uso o cascadetype.persist. Com o tempo, isso construiu uma enorme quantidade de registros infantis que não foram excluídos, a tal extensão que se reflete no desempenho. Agora, desejo adicionar algum código que limpe o banco de dados removendo todos os registros infantis que não são referenciados por um pai. No momento, estamos falando de 400k+ Records, no I Precisa executar o código em todas as instalações do cliente apenas para garantir que eles não tenham o mesmo problema.

Eu acho que a melhor solução seria executar uma consulta nomeada (porque apoiamos dois bancos de dados) que exclui os registros necessários, e é aqui que eu entro em problemas, porque como devo escrevê -lo no JPQL?

O resultado que eu quero pode ser definido como a seguinte instrução SQL, que infelizmente não é executada no 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);
Foi útil?

Solução

DELETE FROM child c
WHERE NOT EXISTS (SELECT 1 FROM parent WHERE child = c.pk)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top