【问题标题】:Pagination in Spring Book JPA with Nested loopsSpring Book JPA 中的分页与嵌套循环
【发布时间】:2020-09-26 01:17:00
【问题描述】:

我正在尝试实现分页。我有两张桌子,一个老师和一个学生。对于每个老师,有多个学生。现在我得到了一个 TeacherNames 列表,对于每个老师,我必须找到它的所有学生并将他们添加到列表中,最后返回它。我也得到页码和大小作为输入。




List<TeacherEntity> teacher = TeacherRepo.findByName(TeacherNames);
Teachers.forEach(teacher - > {
    List<Student> students = studentRepo.findByTeacherName(teacher);
    studentDTO.addAll(students);
});

return StudentDTO;

如果我只需要在 TeachersRepo 中查询,我就知道如何实现分页。但是我不知道当有嵌套时我会怎么做。

【问题讨论】:

    标签: java spring-boot jpa pagination


    【解决方案1】:

    我假设您在学生和老师之间有@ManyToMany 关系。如果没有,您必须在继续之前创建一个。创建关系的示例代码

    public class Teacher
    {
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long teacherId;
        
        //some fields
        
        @ManyToMany(fetch=FetchType.EAGER,cascade = CascadeType.ALL)
        @JoinTable(name = "teacher_student", joinColumns = {
                @JoinColumn(name = "teacherId", referencedColumnName = "techerId") }, inverseJoinColumns = {
                        @JoinColumn(name = "studentId", referencedColumnName = "studentId") })
    
        @BatchSize(size = 20)
        private Set<Stident> students = new HashSet<>();
    //Get and set
    }
    

    现在,在教师存储库中,添加一个在学生和教师之间加入的方法

    @Repository
    public interface TeacherRepo extends JpaRepository<Teacher, Long>
    {   
        @Query(value="SELECT t.teacherName,s.studentName FROM Teacher t left join t.students s")
        public ArrayList<User> findByStudent(Pageable paging);
    }
    

    在你的服务类中调用这个 repo 方法

    public ArrayList<Teacher> findByStudent() 
        {
            // TODO Auto-generated method stub
            Pageable paging = PageRequest.of(0, 4);
            return teacherRepo.findByStudent(paging);
        }
    

    这样你的分页将返回 4 个学生记录。

    注意 - 您可以根据需要添加 where 条件、分页、排序详细信息

    【讨论】:

    • 非常感谢 Sridhar 的回答,我有一个疑问。是否有必要编写我们自己的自定义查询,我的意思是我们不能只使用 JPA 实现
    • 这不是自定义查询,而是 JPQL。如果您的意思是我们为什么要编写 JPQL,那是因为您的需求不是由任何现成的方法直接处理的。如果你必须为老师获取分页,你可以直接使用 findall() 的 pageable。但是由于您希望基于子实体进行分页,因此您需要编写 jpql
    • 可分页页面 = PageRequest.of(pageNo, size); List 老师 = TeacherRepo.findByName(TeacherNames); Teachers.forEach(teacher -> { List students = studentRepo.findByTeacherName(teacher, page); studentDTO.addAll(students); });返回 StudentDTO;
    • 我不能这样吗?这样,我就不必编写 JPQL
    • 没有。这行不通。假设您想在一页中获取总共 4 个学生。您编写的逻辑将为每位教师获取 4 个学生。此外,返回列表不会返回对前端非常重要的重要细节,如当前偏移量、总记录、应用排序等
    猜你喜欢
    • 1970-01-01
    • 2019-11-13
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 2020-09-28
    • 1970-01-01
    • 2016-09-18
    相关资源
    最近更新 更多