java - Spring 数据 JPA。子实体的分页

标签 java jpa spring-boot spring-data one-to-many

我将 Spring Data JPA 与 Spring Boot 版本 1.3.6.RELEASE 与内存数据库一起使用。

我想知道如何为子实体分页 来自父实体。
将获取设置为 懒惰 对我来说不是解决方案。

这是用例:

  • parent 有一个 单向与子实体的一对多关系。
  • 一个Parent的Child数量可以达到100,000(LAZY不是解决方案)
  • 我不想获取所有 child 来进行分页(出于 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);
    

    这将返回父实体,而不是子实体。

    知道如何做到这一点吗?

    最佳答案

    这是一个可以获取知道父实体的子实体的代码示例。
    请注意,此查询将返回 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));
    

    关于java - Spring 数据 JPA。子实体的分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39192091/

    相关文章:

    java - Hibernate:无法部署应用程序打包的持久性提供程序

    java - 可以检查 `@Scheduled` 方法是否已完成执行吗?

    java - 如何在android中显示内容(例如数学等类(class)),例如 "bac 2016"(digischool应用程序)

    java - 当我在 "player object"上使用名为 movePosition() 的方法时,它会更改由该类创建的所有其他对象的 x 位置

    java - 向 JPA 实体添加其他方法

    java - JPA Annotation @Column(insertable=false) 被忽略,为什么?

    java - JPA多对多: Adding existing object to another object

    java - 如何从innersource引用一个项目?

    java - 访问类中的字段

    java - 没有关系实体的 JPA 存储库选择