我有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
Run Code Online (Sandbox Code Playgroud)
现在我想要特定roleId的tokenNames.首先我做了这样的查询SELECT tkns.tokenName FROM Role WHERE Role.roleId=:roleId
但是,我最终得到了一些解引用错误.
然后我把查询改为SELECT tkns FROM Role r WHERE r.roleId=:roleId
现在我已经得到了我想要的东西.但它也伴随着角色.
我该如何获得tokenName?其实我的问题已经解决了,但我想知道怎么做.
如果有人解释查询构造,它会对我有所帮助.
有什么建议!!
axt*_*avt 15
你有没有尝试过
SELECT t.tokenName FROM Role r JOIN r.tkns t WHERE r.roleId = :roleId
Run Code Online (Sandbox Code Playgroud)
编辑:此查询几乎直接映射到相应的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的答案是同一查询的另一种语法.
也可以看看: