繁体   English   中英

如何为多对多关联编写HQL查询?

[英]How to write a HQL query for Many To Many Associations?

我有3个表, Role[roleId, roleName]Token[tokenID, tokenName]ROLETOKENASSOCIATION[roleId, tokenID] 第三个是由hibernate自动创建的。 现在,如果我只是编写一个Query来从Role类中获取所有对象,则它会提供所有角色对象以及关联的tokenID和tokenName。

我只是希望协会是单向的。 ie:Roles ---> Tokens所以Role类中的注释看起来像,

@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

现在我想要特定roleId的tokenNames。 首先我做了一个这样的查询SELECT tkns.tokenName FROM Role WHERE Role.roleId=:roleId但是,我最后得到了一些解引用错误。

然后我将查询更改为SELECT tkns FROM Role r WHERE r.roleId=:roleId现在我已经得到了我想要的东西。 但它也伴随着角色。

我该如何获得tokenName? 其实我的问题已经解决了,但我想知道怎么做。

如果有人解释查询构造,它会对我有所帮助。

有什么建议么!!

你有没有尝试过

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

编辑:此查询几乎直接映射到相应的SQL查询,其中Role r JOIN r.tkns t是通过链接表的SQL连接的简写语法。 Role r JOIN ROLETOKENASSOCIATION rt ON r.roleId = rt.roleId JOIN Token ON rt.tokenId = t.tokenId Affe的答案是同一查询的另一种语法。

也可以看看:

你想要一个名称字段的标量列表? 你应该能够这样做

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM