Hibernate JPA双向实体:查询父实体时,仅选择子实体的子集

Hibernate JPA双向实体:查询父实体时,仅选择子实体的子集,hibernate,spring-data-jpa,spring-data,Hibernate,Spring Data Jpa,Spring Data,假设我有一个Parent,它有一个Set的Child实体 @Entity public class Parent { //... @OneToMany(mappedBy = "parent") Set<Child> children = new HashSet<>(); //... } @Entity public class Child { //... @ManyToOne @JoinColu

假设我有一个
Parent
,它有一个
Set
Child
实体

@Entity
public class Parent {
    //...
    @OneToMany(mappedBy = "parent")
    Set<Child> children = new HashSet<>();
    //...
}

@Entity
public class Child {
    //...
    @ManyToOne
    @JoinColumn(name = "parent_id", nullable = false)
    private Parent parent;
    //...
   
    private Integer someProperty;
}
通过此查询,我拥有其子级拥有的所有
Parent
实体
someProperty>someValue

问题是,在
服务
类中,当我获取
父实例
的子实例时,
Hibernate
从数据库加载所有子实例,而我只希望在作为父实例子实例子集的查询中满足该规范的子实例。

您可以使用:

您可以在查询后使用以下命令禁用筛选器:

entityManager
    .unwrap( Session.class ) 
    .disableFilter( "childrenFilter" );

谢谢两个问题:1-如何在SpringBoot中使用过滤器实现查询?如何启用/禁用过滤器?例如,在后台服务中,我们不需要过滤器。我不知道Spring Boot是否可以开箱即用地处理它们。但它们只有在使用entity manager启用时才起作用,因此只能在运行查询之前启用它们,并在运行查询之后禁用它们
@FilterDef(
    name="childrenFilter",
    parameters=@ParamDef(name="parameter", type="int" ))
@Entity
public class Parent {
    //...
    @FilterJoinTable(
        name="childrenFilter",
        condition="childProperty > :parameter")
    @OneToMany(mappedBy = "parent")
    Set<Child> children = new HashSet<>();
    //...
}
String jpql = "select distinct p from Parent p left join p.children c where c.someProperty > ?1";
entityManager
    .unwrap( Session.class )
    .enableFilter( "childrenFilter" )
    .setParameter( "parameter", 11)
    .createQuery(jpql, Parent.class)
    .setParameter(1, 11)
    .getResultList();
entityManager
    .unwrap( Session.class ) 
    .disableFilter( "childrenFilter" );