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

时间:2010-09-28 19:50:48

标签: java hibernate hql

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

我只是希望关联是单向的。即:角色--->代币 所以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本身? 实际上我的问题已经解决了,但我想知道该怎么做。

如果有人解释了查询构建,那将对我有所帮助。

任何建议!!

2 个答案:

答案 0 :(得分:15)

你试过吗

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

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

另见:

答案 1 :(得分:2)

您想要一个名称字段的标量列表吗?你应该能够像这样得到它

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