2009-07-29 9 views
7

Y si es así, ¿cuál es la sintaxis?¿Es posible eliminar a granel de una asociación muchos con HQL?

Supongamos que yo quiero una instancia de Foo sea no asociado a todas las instancias de barras: En SQL sería simplemente:

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 mapeado de Foo)

Pero parece estar mal, dando:

org.hibernate.hql.ast.QuerySyntaxException: Bar.foos is not mapped 

¿Esto es posible con HQL?

Respuesta

6

Para responder a su pregunta específica, no, por lo que yo soy consciente de que no es posible con HQL .

Creo que estás mezclando SQL y HQL un poco aquí. En SQL, usted efectivamente "borra" registros, y por supuesto hibernate también lo hará. Sin embargo, Hibernate/HQL está diseñado desde un modo de pensar orientado a objetos, por lo que "eliminar" en este contexto significa que está eliminando objetos, no asociaciones. Normalmente, usted haría algo como sigue:

Foo f = session.get(Foo.class, id); 
f.getBars().clear(); 
session.merge(f); 

Esta recupera el objeto por el id especificado, y elimina todos los colegios de abogados en la limpieza de su colección. Obviamente, debes tener la asociación de Foo-Bars asignada en la dirección correcta para que esto funcione.

+2

Tenga en cuenta que esto solo eliminará la entrada de la tabla de asociación, no el elemento al final. Para hacer eso, necesitaría tener delete-huérfanos activados. – aperkins

1

La eliminación de asociaciones por sí sola no es posible con HQL. Lo que puede hacer, sin embargo, es:

A) Suponiendo que lo hace por un solo Foo y su cascada está configurada apropiadamente, puede cargar esa instancia Foo, borrar su colección de bars y guardarla.

B) Si usted está tratando de limpiar bars de múltiples Foos puede asignar una consulta SQL en lugar de HQL

Cuestiones relacionadas