我有以下对象:用户和角色
我的数据库中有一个名为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)中“
这将继续返回同时具有这两个角色的用户。我是不是漏掉了什么?
谢谢你的时间,玛格丽特
发布于 2017-02-06 15:17:16
因为您从那个"NOT IN“中排除的不是"User”而是"Role“。所以用户仍然显示在该查询中。
假设您有角色为1和2的用户A,当您加入此操作时,这将变成两行。因此,如果您使用"ROLE.ID NOT IN 1“,那么您仍然有一行用户A具有角色2。
发布于 2017-02-06 15:38:52
多亏了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)安加,我将你的答案标记为正确,因为它帮助我找到了我所需要的实际语法。
https://stackoverflow.com/questions/42061808
复制相似问题