É possível exclusão em massa a partir de uma associação muitos-muitos com HQL?

StackOverflow https://stackoverflow.com/questions/1201690

  •  05-07-2019
  •  | 
  •  

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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top