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 に詳しくありません。