弹簧数据 JPA。子实体的分页
Posted
技术标签:
【中文标题】弹簧数据 JPA。子实体的分页【英文标题】:Spring Data JPA. Pagination for child entities 【发布时间】:2017-01-04 15:34:32 【问题描述】:我将 Spring Data JPA 与 Spring Boot 版本 1.3.6.RELEASE 与内存数据库一起使用。
我想知道如何从父实体对子实体进行分页。 将 fetch 设置为 LAZY 对我来说不是解决方案。
这是用例:
-
Parent 与 Child entity 具有单向 oneToMany 关系。
一个Parent的Child数量可以达到100,000(LAZY不是解决办法)
我不想让所有孩子进行分页(出于 CPU 和内存原因)
这是一个代码示例:
@Entity
public class Parent
@Id
private Integer id;
@OneToMany
private List<Child> childs;
@Entity
public class Child
@Id
private Integer id;
public interface ParentRepository extends JpaRepository<Parent, Integer>
public interface ChildRepository extends JpaRepository<Child, Integer>
我在父存储库中尝试过此操作失败:
Page<Child> findById(int id, Pageable pageable);
这将返回父实体,而不是子实体。
知道怎么做吗?
【问题讨论】:
好吧,既然您正在寻找子实体,那么该方法应该在 ChildRepository 中,并且应该命名为 findByParent,并返回与给定父实体关联的子实体。类似于select child from Parent p inner join p.children child where p = :parent
。
即使关系是单向的,它会起作用吗?我试试看。
我试图解决的同样的问题没有任何运气。如果能够解决,您可以回答您的问题。 Related Question
我刚刚做了@JBNizet 提到的。
【参考方案1】:
假设父母被称为“父母”,你也可以这样做:
repo.findAllByParent(parent, pageable)
;
【讨论】:
【参考方案2】:这是一个代码示例,可以获取知道父实体的子实体。 请注意,此查询将返回 Child 的分页结果。
/**
* Find Child entities knowing the Parent.
*/
@Query("select child from Parent p inner join p.childs child where p = :parent")
public Page<Child> findBy(@Param("parent") Parent parent, Pageable pageable);
你可以这样使用它:
Page<Child> findBy = repo.findBy(parent, new PageRequest(page, size));
【讨论】:
我尝试做一些类似的事情,你能在这篇文章中分享一些意见吗?:***.com/q/64491315/4005379以上是关于弹簧数据 JPA。子实体的分页的主要内容,如果未能解决你的问题,请参考以下文章
Spring提供的JPA的分页的功能,和动态搜索后进行显示的分页功能的设置