我有两个实体,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 还不是很熟悉。