(使用Spring Data JPA)我有两个实体Parent
和Child
,它们之间存在OneToMany/ManyToOne双向关系。
@Entity
@NamedEntityGraph(name = "Parent.Offspring", attributeNodes = @NamedAttributeNodes("children"))
public class Parent{
//blah blah blah
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
Set<Child> children;
//blah blah blah
}
请注意,Parent的子对象的获取类型是LAZY。这是故意的。当我查询单个父对象时,我并不总是想立即加载子对象。通常,可以说,我可以使用命名实体图按需立即加载子对象。但是......
有一个特定的情况,我想查询一个或多个父对象,并急切地加载它们的子对象。除此之外,我需要能够以编程方式构建这个查询。Spring Data提供了JpaSpecificationExecutor,它允许构建动态查询,但是我不知道如何将它与实体图结合使用,以便在这个特定的情况下快速加载子对象。是否有其他方法可以使用规范将'toMany实体'快速加载?
7条答案
按热度按时间omtl5h9j1#
解决方案是创建一个实现以下功能的自定义存储库接口:
同时创建一个实现:
并创建工厂:
并将默认存储库工厂Bean更改为新Bean,例如,在Spring Boot 时将以下内容添加到配置中:
有关自定义存储库的更多信息:http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.custom-behaviour-for-all-repositories
ajsxfq5m2#
我设法通过覆盖
findAll
方法并向其添加注解@EntityGraph
来实现这一点:dwthyt8l3#
Joepie的回答是OK。
但您不需要创建存储库FactoryBeanClass,也不需要设置存储库BaseClass
lsmepo6l4#
项目Spring Data JPA EntityGraph实现了其他答案中提到的一些方法。
例如,它具有以下附加存储库接口:
EntityGraphJpaRepository
,相当于标准JpaRepository
EntityGraphJpaSpecificationExecutor
,相当于标准的JpaSpecificationExecutor
请查看reference documentation以了解一些示例。
sbdsn5lh5#
为了补充Joep和pbo的答案,我不得不说,对于新版本的Spring Data JPA,您必须修改
CustomRepositoryImpl
的构造函数。该类需要具有特定于存储的资料档案库工厂实施正在使用的超类的构造函数。如果资料档案库基类具有多个构造函数,请覆盖采用EntityInformation和特定于存储的基础结构对象(例如EntityManager或模板类)的构造函数。
我使用以下构造函数:
我还添加了一个私有字段来存储域类:
这样我就可以摆脱不赞成使用的方法
readPage(javax.persistence.TypedQuery<T> query, Pageable pageable, @Nullable Specification<T> spec)
,而使用:ibps3vxo6#
顺便说一句,仓库bean的工厂不是必需的。你只需要一个简单的Bean吗?
你可以在这里看到我的完整例子:https://github.com/netstart/POCs/tree/master/jpa/jpaspecification-whith-entity-graph
第一个
ymdaylpp7#
看一看Composite Specification API,它可以满足您的需求。This类实现了Specification接口,并且可以像example中那样进行组合。如果您要获取姓“Doe”的父母及其在1.1.1990之前出生的孩子,则需要以下规范:
和查询: