JPA查询与@ManyToMany关系

时间:2016-05-24 19:53:40

标签: java jpa

我有这些课程:

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]。

2 个答案:

答案 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]