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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top