条件查询,查找我不属于的所有组

Posted

技术标签:

【中文标题】条件查询,查找我不属于的所有组【英文标题】:Criteria query, find all groups that I'm not member of 【发布时间】:2011-09-15 08:22:45 【问题描述】:

我有两个实体,Group 和 GroupMember。组就像听起来是一个具有名称和其他一些属性的组。该组的成员与 GroupMember 实体映射,该实体具有一个用户条目和用户所属的每个组的组。它们如下所示:

@Entity
@Table(name = EntityTokens.GROUP_TABLE)
public class Group

   @Id
   @Column(name = EntityTokens.GROUP_ID_COLUMN) 
   @GeneratedValue(strategy = GenerationType.IDENTITY)    
   private Long groupId;

   ...

   // Group members
   @OneToMany(orphanRemoval = true, fetch = FetchType.LAZY, mappedBy = "group", cascade = CascadeType.ALL)
   private Collection<GroupMember> groupMembers;


@Entity
@Table(name = EntityTokens.GROUP_MEMBER_TABLE)
public class GroupMember

   @Id
   @Column(name = EntityTokens.GROUP_MEMBER_ID_COLUMN) 
   @GeneratedValue(strategy = GenerationType.IDENTITY)    
   private Long memberId;

   ...

   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = EntityTokens.GROUP_MEMBER_ID_COLUMN)
   private Group group;

我正在尝试编写一个条件查询,该查询返回具有某些预定义属性且当前用户不属于的所有组。我的查询如下所示:

CriteriaQuery<Group> q = cb.createQuery(Group.class);
Root<Group> root = q.from(Group.class);

Join<Group, GroupMember> groups = root.join(Group_.groupMembers);

q.select(root);
q.where(cb.notEqual(groups.get(GroupMember_.user), user),
    cb.equal(root.get(Group_.global), false),
    cb.equal(root.get(Group_.personal), false),
    cb.equal(root.get(Group_.privacy), GroupPrivacy.PUBLIC));
q.distinct(true);           

这里的用户代表当前用户。此查询不起作用,因为如果有其他成员与我属于同一组,他们将由于加入而包含在查询结果中。正确的查询应该是什么样子?我对条件查询 API 还不是很熟悉。

【问题讨论】:

【参考方案1】:

ToMany 关系的连接在概念上是一个“anyOf”操作,这意味着如果许多中的任何一个为真,则表达式为真。

你想要的是一个“allOf”,条件没有这个,你需要在SQL中为此使用一个子选择。

JPQL 应该是,

Select g from Group g where not exists (select m from g.members m where m.user = :user)

条件是相同的,对存在使用子条件查询。

【讨论】:

以上是关于条件查询,查找我不属于的所有组的主要内容,如果未能解决你的问题,请参考以下文章

access 模糊查询 条件 like

电源查询:如果满足条件,则查找最小日期

从 2 个集合中解析查询

Java如何根据条件查询相应的数据并分页

MongoDB 条件查询和排序

根据条件选择查询和计数