É possível exclusão em massa a partir de uma associação muitos-muitos com HQL?
Pergunta
E se assim for, qual é a sintaxe?
Suponha que eu quero uma instância de Foo ser unassociated de todas as instâncias de Bar: Em SQL seria simplesmente:
delete from FOO_BAR_MAPPING
where FOO_ID = ?
Em HQL, eu achava que seria algo como:
delete from Bar.foos foos
where foos.id = :id
(onde foos é uma colecção de mapeado Foo)
mas parece ser errado, dando:
org.hibernate.hql.ast.QuerySyntaxException: Bar.foos is not mapped
É isto mesmo possível com HQL?
Solução
Para responder à sua pergunta específica, não, tanto quanto eu estou ciente que não é possível com HQL.
Eu acho que você está misturando SQL e HQL um pouco aqui. Em SQL, você de fato "apagar" registros, e, claro, hibernate acabará por fazer isso também. No entanto Hibernate / HQL é projetado de uma mentalidade orientada a objeto, de modo "apagar" neste meio de contexto que você está excluindo objetos, e não associações. Normalmente, você faria algo como segue:
Foo f = session.get(Foo.class, id);
f.getBars().clear();
session.merge(f);
Este recupera o objeto pelo id especificado, e remove todas as associações de advogados, limpando-o da coleção. Obviamente você tem que ter a associação Foo-Barra mapeados na direção correta para que isso funcione.
Outras dicas
A remoção associações por si só não é possível com HQL. O que você pode fazer, no entanto, é:
A) Supondo que você está fazendo isso para um único Foo e seu cascata é definido de forma adequada, você pode carregar essa instância Foo
, limpar sua coleção de bars
e salvá-lo.
B) Se você está tentando bars
clara de múltipla Foos
você pode mapear uma consulta SQL em vez de HQL