У меня есть две сущности, 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 запроса критериев.