2012-05-14 10 views
6

que tiene una estructura como esta:Hibernate Query Language (HQL) - Oferta de los/carga no-Lazy

  • A contiene colección de B (asignada como no-perezoso)
  • B contiene colección de C (asignado como no perezoso)

Me gustaría realizar una consulta, que recupera objetos A, que contienen objetos B sin los objetos C dentro de ellos. ¿Es eso posible? A la inversa, también funcionará para mí (si la relación B-C está asignada como floja y la consulta recupera A, que contiene B y C).

Gracias!

+0

Posible duplicado de [Hibernate: anulando la asignación de EAGER en HQL?] (Http://stackoverflow.com/questions/3072568/hibernate-overriding-mappings-eager-in-hql) – davidwebster48

Respuesta

5

No, no es posible. Dado que marcó la asociación en sí misma como cargada con entusiasmo, Hibernate siempre cargará esta asociación con entusiasmo.

Si marca la asociación como un perezoso (el valor predeterminado para asociaciones toMany), entonces usted tiene ª opción de ir a buscar ansiosamente en una consulta, utilizando un join fetch:

select a from A a left join fetch a.bs b left join fetch b.cs 

Tenga en cuenta que esto no va a funcionar si ambas colecciones son bolsas (es decir, listas sin columna de índice).

+0

Hola, gracias por la respuesta. Encontré este tema también, la respuesta es la misma: http://stackoverflow.com/questions/3516873/hql-fetch-join-collections-from-eager-table Pero estoy teniendo algunos problemas para hacerlo funcionar bien- multiplica la "A" muchas veces. Muy probablemente mi error. – Mooncrosser

+0

Resuelto, "distinto" es necesario para que funcione correctamente (no soy un experto y no tengo idea de cuál es la diferencia). Voy a marcar esto como la respuesta correcta, pero será bueno si lo editas o me dices dónde está la diferencia :) – Mooncrosser

+1

Sin distinguir, Hibernate devuelve 1 resultado por fila del conjunto de resultados JDBC. Esto significa que si solo tiene una A con 2 B, y cada B tiene 2 C, la consulta devolverá 4 filas, y la lista contendrá 4 veces la misma instancia de A. La palabra clave distinct hace que Hibernate elimine duplicados de la lista . –

Cuestiones relacionadas