如何在Hibernate中为联合集合指定“NOT IN”

时间:2017-02-06 06:45:03

标签: hibernate join hql

我有以下对象:用户和角色

我的数据库中有一个名为user_role的链接表,它创建了多对多关系,为任何用户授予任何角色。在我的java对象上,这种关系的映射方式是User有一个名为roles的集合,它是Role类型的列表。

我有一个按角色搜索用户的服务。这很简单。

“select * from User u join u.roles as role where role.id in(:theRoleIWant)”

工作正常。但是现在我想返回一个没有角色的用户列表。

例如,基本级别用户具有角色6,管理用户具有角色3.用户可以同时拥有这两种角色,但对于我的查询,我只对没有角色ID 3的基本级别用户感兴趣。所以我这样做:

“select * from User u join u.roles as role where role.id in(6)and role.id in in(3)”

这将继续返回具有这两个角色的用户。这里有什么我想念的吗?

谢谢你的时间, 霭

2 个答案:

答案 0 :(得分:1)

因为您从“NOT IN”中排除的那个不是“用户”而是“角色”。所以用户仍然在该查询中显示。

想象一下,当您加入此角色时,您的用户A的角色为1和2,这将成为两行。因此,如果您使用“ROLE.ID NOT IN 1”,您仍然会有一行用户A具有角色2.

答案 1 :(得分:1)

感谢Angga我完全可以采用不同的方法来查询。这就是我最终的结果:

select * from User u join u.roles as role where role.id in (:theRoleIWant) 
and not exists (select 1 from User inner_u join inner_u.roles as inner_role where inner_role.id in (:theRolesIWantToAvoid) and inner_u.id = u.id)

Annga我正在将您的答案标记为正确,因为它帮助我找到了我需要的实际语法。