2009-07-22 6 views
10

j'ai des objets Hibernate qui ressemble à ceci:HQL et un à plusieurs requêtes

class Player { 
     List<Item> inventory; 
    } 

    class Item { 
     List<Enchantment> enchantments; 
    } 

    class Enchantment { 
     boolean isSuperiorEnchantment; 
    } 

J'ai besoin de construire une requête HQL qui me revient une liste de tous les joueurs qui ont au moins un élément avec un enchantement sur celui-ci qui a le jeu de drapeau isSuperiorEnchantment. Je ne peux pas pour la vie de moi trouver un moyen d'exprimer cela en HQL.

Des idées?

Répondre

17

En supposant que les correspondances appropriées sur l'ensemble de ce qui précède, la requête que vous cherchez est:

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

Merci, cela a très bien fonctionné. Je devais me rappeler d'ajouter un "select p" à l'avant de celui-ci, mais sinon c'est exactement ce dont j'avais besoin! –

+0

J'apprends juste HQL, mais en SQL normal cela ne fonctionnerait pas - la jointure gauche signifierait que vous obtiendriez des résultats de joueur même s'il n'y a aucun enregistrement correspondant dans l'inventaire et les enchantements. (Je vais continuer à creuser pour obtenir des éclaircissements sur ce point ... J'ai une suspicion "left join" signifie quelque chose de différent dans HQL, ou cette requête ne serait pas très utile). –

+1

@RobWhelan La requête ci-dessus fonctionnerait (avec des ajustements appropriés à la syntaxe, bien sûr) très bien en SQL normal en raison de la condition 'e.isSuperiorEnchantment = 1' qui ne serait pas satisfaite pour les joueurs sans Enchantements puisque' isSuperiorEnchantment' serait retourné comme nul. – ChssPly76

Questions connexes