如何在 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 我将您的回答标记为正确,因为它帮助我找到了我需要的实际语法。
我有以下对象:用户和角色
我的数据库中有一个名为 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 我将您的回答标记为正确,因为它帮助我找到了我需要的实际语法。