有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有3个表,Role[roleId, roleName]Token[tokenID, tokenName]&ROLETOKENASSOCIATION[roleId, tokenID]。第三个是由hibernate自动创建的。现在,如果我只编写一个查询,从Role class means获取所有对象,它将提供所有角色对象以及相关联的tokenID&;标记名

我只是希望协会是单向的。i、 e:角色-->;代币 角色类中的注释如下所示:

@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的标记名。 首先我做了一个这样的查询SELECT tkns.tokenName FROM Role WHERE Role.roleId=:roleId 但是,我最终出现了一些解引用错误

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

我怎样才能得到这个名字呢? 实际上我的问题已经解决了,但我想知道怎么做

如果有人解释一下查询结构,对我会有帮助的

任何建议


共 (2) 个答案

  1. # 1 楼答案

    你试过了吗

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

    EDIT:此查询几乎直接映射到相应的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的答案是同一查询的另一种语法

    另请参见:

  2. # 2 楼答案

    您只需要名称字段的标量列表吗?你应该能做到这样

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