Выберите Parent Entity, где данный набор (параметр) является точным подмножеством дочернего набора Parent в отношении ManyToMany в JPA-запросе. - PullRequest
0 голосов
/ 04 марта 2019

Допустим, родительский объект - Parent.Имеет отношение ManyToMany с ребенком Child.

@Entity
public class Parent{
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinColumn(name="child_Id")
    private Set<Child> childs;
}

And Child,

@Entity
public class Child{
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "child_parent",
            joinColumns = @JoinColumn(name = "child_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(name = "parent_id", referencedColumnName = "id"))
    Set<Resource> parents;
}

Предположим, наши родительские объекты:

parent1 has child -> childA, childB, childC;
parent2 has child -> childB, childC;
parent3 has child -> childB, childC, childD;
parent4 has child -> childA, childC;
parent5 has child -> childA, childB, childC, childD;

Теперь я хочу опросить всех тех родителей, у которых есть childA,childC вместе.Таким образом, в этом случае родителями будут parent1, parent4 и parent5.(parent2 и parent3 не принимаются, поскольку у них нет childA и childC вместе)

Моя подпись метода интерфейса JPA.

List<Resource> findParentByChilds (@Param("childs") Set<Child> childs)

1 Ответ

0 голосов
/ 04 марта 2019

Вот простое решение с использованием SQL

SELECT parent_id
FROM child_parent
WHERE child_id IN ('childA', 'childC')
GROUP BY parent_id
HAVING COUNT(DISTINCT child_id) = 2

Если родитель не может иметь одного и того же потомка дважды (например, у вас есть уникальный ключ на (parent_id, child_id), тогда вы можете удалить DISTINCT из COUNT() агрегатная функция.

Это должно быть просто, чтобы перевести это в JPQL, или вы просто используете собственный запрос SQL.

...