¿Es posible eliminar de forma masiva una asociación de muchos con HQL?
Pregunta
Y si es así, ¿cuál es la sintaxis?
Supongamos que quiero que una instancia de Foo no esté asociada con todas las instancias de Bar: En SQL simplemente sería:
delete from FOO_BAR_MAPPING
where FOO_ID = ?
En HQL, supuse que sería algo así como:
delete from Bar.foos foos
where foos.id = :id
(donde foos es una colección mapeada de Foo)
Pero parece estar equivocado, dando:
org.hibernate.hql.ast.QuerySyntaxException: Bar.foos is not mapped
¿Esto es posible incluso con HQL?
Solución
Para responder a su pregunta específica, no, que yo sepa, no es posible con HQL.
Creo que estás mezclando SQL y HQL un poco aquí. En SQL, de hecho " eliminar " registros, y por supuesto hibernación en última instancia, también lo hará. Sin embargo, Hibernate / HQL está diseñado desde una mentalidad orientada a objetos, por lo que " eliminar " en este contexto significa que está eliminando objetos, no asociaciones. Por lo general, haría algo como lo siguiente:
Foo f = session.get(Foo.class, id);
f.getBars().clear();
session.merge(f);
Esto recupera el objeto por el ID que ha especificado y elimina todas las asociaciones de barras borrando su colección. Obviamente, debe tener la asociación Foo-Bars asignada en la dirección correcta para que esto funcione.
Otros consejos
Eliminar asociaciones por sí solo no es posible con HQL. Lo que puede hacer, sin embargo, es:
A) Suponiendo que lo está haciendo para un solo Foo y su cascada está configurada adecuadamente, puede cargar esa instancia de Foo
, borrar su colección de bars
y guardar eso.
B) Si está intentando borrar barras
de múltiples Foos
, puede asignar una consulta SQL en lugar de HQL