2009-07-22 14 views
10

que tienen objetos de dominio de Hibernate que tiene este aspecto:HQL y uno-a-muchas consultas

class Player { 
     List<Item> inventory; 
    } 

    class Item { 
     List<Enchantment> enchantments; 
    } 

    class Enchantment { 
     boolean isSuperiorEnchantment; 
    } 

necesito para construir una consulta HQL que vuelve a mí una lista de todos los jugadores que tienen al menos un elemento con un encantamiento que tiene establecido el indicador isSuperiorEnchantment. No puedo entender cómo expresar esto en HQL.

¿Alguna idea?

Respuesta

17

Suponiendo que las asignaciones correspondientes en todo lo anterior, la consulta que estás buscando es:

select p 
from Player as p 
    left join p.inventory as i 
    left join i.enchantments as e 
where e.isSuperiorEnchantment = 1 
+0

Gracias, esto funcionó muy bien. Tuve que acordarme de agregar una "p de selección" al principio, ¡pero de lo contrario es exactamente lo que necesitaba! –

+0

Estoy recién aprendiendo HQL, pero en SQL regular esto no funcionaría: la combinación de la izquierda significa que obtendrás resultados de jugador incluso si no hay registros coincidentes en Inventario y Encantamientos. (Seguiré buscando explicaciones sobre esto ... Sospecho que "left join" significa algo diferente en HQL, o esta consulta no sería de mucha utilidad). –

+1

@RobWhelan La consulta anterior funcionaría (con los ajustes adecuados a la sintaxis, por supuesto) muy bien en SQL regular debido a la condición 'e.isSuperiorEnchantment = 1' que no se cumpliría para los Jugadores sin Encantamiento ya que' isSuperiorEnchantment' sería devuelto como nulo. – ChssPly76