0

Group と GroupMember の 2 つのエンティティがあります。グループは、名前とその他のプロパティを持つグループのように聞こえます。グループのメンバーは、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 に詳しくありません。

4

1 に答える 1

0

ToMany 関係の結合は、概念的には「anyOf」操作です。つまり、多くのいずれかが true の場合、式は true です。

必要なのは「allOf」です。基準にはこれがありません。SQLでこれにサブ選択を使用する必要があります。

JPQLは、

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

基準は同じで、exists のサブ基準クエリを使用します。

于 2011-09-15T14:49:17.473 に答える