弹簧数据 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 关系。 一个ParentChild数量可以达到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 Data JPA 中的分页(限制和偏移)

Spring提供的JPA的分页的功能,和动态搜索后进行显示的分页功能的设置

从控制器的结果集中排除列 |弹簧数据 jpa

弹簧数据 JPA。如何从 findAll() 方法中仅获取 ID 列表

mysql的分页使用子查询?

将jpa实体作为弹簧组件是一个好主意