我有这些课程:
public class Group {
@ManyToMany
private Set<Person> members;
}
public class Person {
}
我使用以下查询(基于此question)来查找包含指定成员列表的组:
select g from Groups g join g.members member where member in :members
(以:成员为集合)
当然[Person1,Person2]匹配[Person1,Person2]以及[Person1,Person2,Person3],......
现在,我想找到与指定成员列表完全匹配的组,即[Person1,Person2]匹配[Person1,Person2],但不匹配[Person1,Person2,Person3]。
答案 0 :(得分:2)
这应该选择具有确切成员列表但没有其他成员的所有组。
SELECT group1 FROM Groups group1
JOIN group1.members member1
WHERE SIZE(:members) = (
SELECT COUNT(member2) FROM Groups group2
JOIN group2.members member2
WHERE group2.id = group1.id)
AND SIZE(:members) = (
SELECT COUNT(member2) FROM Groups group2
JOIN group.members member2
WHERE group2.id = group1.id AND member2.id IN :members)
基本上,您希望所有具有以下条件的组:
这应涵盖收集内容平等。你正在寻找的所有人都在那里,而且没有更多。
另请参阅:Selecting an entity by collection set equality以获得替代但类似的技术。
答案 1 :(得分:0)
select g from Groups g inner join g.members member
where member.id in :members and not exists(
select group.id
from Groups group inner join group.members xmember
where group.id = g.id and xmember.id in :excludeMembers)
members = [Person1.id, Person2.id]
excludeMembers = [Person3.id]