在“ JPA查询”中的ManyToMany关系中,选择给定集(参数)是父级子集的精确子集的父级实体

时间:2019-03-04 08:22:07

标签: spring-boot jpa spring-data-jpa jpa-2.0 jpql

比方说父实体是Parent。它与子ManyToManyChild关系。

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

还有孩子

@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;

现在,我要查询所有childAchildC在一起的父母。因此,在这种情况下,父母将是parent1parent4parent5。 (不接受parent2和parent3,因为它们没有一起childAchildC

我的JPA接口方法签名。

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

1 个答案:

答案 0 :(得分:1)

这是使用SQL的简单解决方案

Element

如果父母不能两次生育同一个孩子(例如,您在@BootstrapWith(SpringBootTestContextBootstrapper.class) @OverrideAutoConfiguration(enabled = false) @AutoConfigureCache @AutoConfigureDataJpa @AutoConfigureTestDatabase @AutoConfigureTestEntityManager @ImportAutoConfiguration 上具有唯一键,则可以从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)

将其转换为JPQL应该很简单,否则您只需使用本机SQL查询即可。