【问题标题】:How to write a HQL query for Many To Many Associations?如何为多对多关联编写 HQL 查询?
【发布时间】:2011-04-18 12:09:28
【问题描述】:

我有 3 张桌子,Role[roleId, roleName]Token[tokenID, tokenName]ROLETOKENASSOCIATION[roleId, tokenID]。第三个是由休眠自动创建的。现在,如果我简单地编写一个查询来从 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

现在我想要特定角色 ID 的令牌名称。 首先我做了一个这样的查询SELECT tkns.tokenName FROM Role WHERE Role.roleId=:roleId 但是,我最终遇到了一些取消引用错误。

然后我将查询更改为SELECT tkns FROM Role r WHERE r.roleId=:roleId 现在我得到了我想要的。但它也带有 roleId。

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

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

有什么建议!!

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    你试过了吗

    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 的答案是同一查询的另一种语法。

    另请参阅:

    【讨论】:

    • 实际上,我是 hibernate 和 HQL 的新手。如果你解释一下查询会对我有帮助!!!
    【解决方案2】:

    您想要一个仅包含名称字段的标量列表?你应该可以得到这样的

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2018-10-07
      • 2015-06-24
      • 2011-08-21
      • 2013-06-08
      • 1970-01-01
      相关资源
      最近更新 更多