Запрос критериев, найдите все группы, к которым я не принадлежу - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть две сущности, 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 Ответ

0 голосов
/ 15 сентября 2011

объединение для отношения ToMany концептуально является операцией anyOf, означающей, что если любое из множества имеет значение true, тогда выражение является истинным.

То, что вы хотите, это "allOf", критерии не имеют этого, вам нужно использовать дополнительный выбор для этого в SQL.

JPQL будет,

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

Критерии будут такими же, с использованием запроса подкритериев для существующих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...