2010-09-28 6 views
9

J'ai 3 tables, Role[roleId, roleName], Token[tokenID, tokenName] & ROLETOKENASSOCIATION[roleId, tokenID]. Le 3ème a été créé automatiquement par hibernate. Maintenant, si j'écris simplement une requête pour obtenir tous les objets des moyens de la classe Role, cela donne tous les objets de rôle avec le tokenID associé & tokenName. Je voulais juste que l'association soit unidirectionnelle. i.e.: Rôles ---> Jetons Ainsi, l'annotation dans la classe de rôle ressemble,Comment écrire une requête HQL pour plusieurs associations?

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private int roleId; 
private String roleName; 

@ManyToMany 
@JoinTable(name="ROLE_TOKEN_ASSOCIATION", 
joinColumns={@JoinColumn(name="roleId")}, 
inverseJoinColumns={@JoinColumn(name="tokenID")}) 
private List<Token> tkns; 
    //Getters & Setters 

Maintenant, je veux les tokenNames pour la RoleId spécifique. D'abord j'ai fait une requête comme ceci SELECT tkns.tokenName FROM Role WHERE Role.roleId=:roleId Mais, j'ai fini avec une erreur de déréférencement.

Puis j'ai changé la requête en SELECT tkns FROM Role r WHERE r.roleId=:roleId Maintenant, j'ai ce que je voulais. Mais il est livré avec roleId aussi.

Comment dois-je obtenir tokenName lui-même? En fait, mon problème est résolu, mais je voudrais savoir comment le faire.

Cela va être utile pour moi, si quelqu'un explique la construction de la requête.

Toutes les suggestions !!

Répondre

10

Avez-vous essayé

SELECT t.tokenName FROM Role r JOIN r.tkns t WHERE r.roleId = :roleId 

EDIT: Cette requête presque cartes directement à la requête SQL correspondante où Role r JOIN r.tkns t est une syntaxe abrégée pour la JOIN SQL via la table de liens Role r JOIN ROLETOKENASSOCIATION rt ON r.roleId = rt.roleId JOIN Token ON rt.tokenId = t.tokenId. La réponse d'Affe est une autre syntaxe pour la même requête.

Voir aussi:

+0

En fait, je suis nouveau mise en veille prolongée et HQL. Il serait utile pour moi si vous expliquez la requête !!! –

+0

@NooB: mise à jour. – axtavt

1

Vous voulez une liste scalaire de juste le champ de nom? Vous devriez être en mesure d'obtenir que, comme ce

select t.name from Roles r, IN(r.tkns) t where r.roleId = :id 
Questions connexes