如何在 Hibernate 中为连接的集合指定 "NOT IN"

How to specify "NOT IN" for a joined collection in Hibernate

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

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

我有一项按角色搜索用户的服务。这很容易。

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

效果很好。但是现在我想要 return 一个没有角色的用户列表。

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

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

这将继续 return 具有这两种角色的用户。我在这里遗漏了什么吗?

感谢您的宝贵时间, 玛格丽特

因为您从 "NOT IN" 中排除的不是 "User",而是 "Role"。所以用户仍然显示在该查询中。

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

多亏了 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 我将您的回答标记为正确,因为它帮助我找到了我需要的实际语法。