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" );