首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Hibernate中为联接的集合指定"NOT IN“

如何在Hibernate中为联接的集合指定"NOT IN“
EN

Stack Overflow用户
提问于 2017-02-06 14:45:03
回答 2查看 33关注 0票数 0

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

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

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

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

这很好用。但是,现在我想返回一个没有角色的用户列表。

例如,一个基层用户有一个角色6,一个管理用户有一个角色3。用户可以同时拥有这两个角色,但在我的查询中,我只对没有角色id 3的基层用户感兴趣。所以我这样做:

"select * from User u加入u.roles作为角色,其中role.id在(6)中,role.id不在(3)中“

这将继续返回同时具有这两个角色的用户。我是不是漏掉了什么?

谢谢你的时间,玛格丽特

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-06 15:17:16

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

假设您有角色为1和2的用户A,当您加入此操作时,这将变成两行。因此,如果您使用"ROLE.ID NOT IN 1“,那么您仍然有一行用户A具有角色2。

票数 1
EN

Stack Overflow用户

发布于 2017-02-06 15:38:52

多亏了Angga,我能够对查询采取完全不同的方法。这就是我最终得到的结论:

代码语言:javascript
复制
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)

安加,我将你的答案标记为正确,因为它帮助我找到了我所需要的实际语法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42061808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档