2009-07-22 5 views
10

Ich habe Hibernate Domain-Objekte, die wie folgt aussieht:HQL und One-to-many-Abfragen

class Player { 
     List<Item> inventory; 
    } 

    class Item { 
     List<Enchantment> enchantments; 
    } 

    class Enchantment { 
     boolean isSuperiorEnchantment; 
    } 

Ich brauche eine HQL-Abfrage zu erstellen, die eine Liste aller Spieler zu mir zurückgibt, die mindestens ein Element haben mit einer Verzauberung darauf, die die isSuperiorEnchantment Flagge gesetzt hat. Ich kann nicht für das Leben von mir einen Weg finden, dies in HQL auszudrücken.

Irgendwelche Ideen?

Antwort

17

die entsprechenden Zuordnungen auf alle der oben genannten Angenommen, die Abfrage nach dem Sie suchen ist:

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

Danke, das hat super funktioniert. Ich musste daran denken, ein "select p" an der Vorderseite hinzuzufügen, aber ansonsten war es genau das, was ich brauchte! –

+0

Ich lerne gerade HQL, aber in regulärem SQL würde das nicht funktionieren - der linke Join würde bedeuten, dass du Spielerergebnisse bekommst, selbst wenn es keine passenden Einträge in Inventar und Verzauberungen gibt. (Ich werde weiter nach Klärung suchen ... Ich habe den Verdacht, "linker Beitritt" bedeutet etwas anderes in HQL, oder diese Abfrage würde nicht viel nützen). –

+1

@RobWhelan Die obige Abfrage würde (bei entsprechender Anpassung der Syntax natürlich) in regulärem SQL funktionieren, da die Bedingung 'e.isSuperiorEnchantment = 1' für Spieler ohne Verzauberungen nicht erfüllt wäre, da 'isSuperiorEnchantment' als zurückgegeben würde Null. – ChssPly76