在Spring Data JPA中创建分页功能

21

我正在尝试在Spring Data JPA中实现分页功能。 我参考了这个博客。 我的控制器包含以下代码:

 @RequestMapping(value="/organizationData", method = RequestMethod.GET)
  public String list(Pageable pageable, Model model){
    Page<Organization> members = this.OrganizationRepository.findAll(pageable);
    model.addAttribute("members", members.getContent());
    float nrOfPages = members.getTotalPages();
    model.addAttribute("maxPages", nrOfPages);
    return "members/list"; 
  }

我的DAO正在遵循以下内容:

@Query(value="select m from Member m", countQuery="select count(m) from Member m")
  Page<Organization> findMembers(Pageable pageable);

我可以展示前20条记录,如何展示接下来的20条记录?是否有其他分页示例可供参考?


是的,我看到了,但是那是Spring MVC,我想在Spring Data JPA中实现相同的功能。我该如何修改它以适应Spring Data JPA? - Tejas
只需在请求参数中使用名称为 page 的参数,它将绑定到您的请求方法中的 Pageable 对象。 - M. Deinum
实际上,我正在开发的项目是使用Spring Data JPA,因此我需要在Spring Data JPA中实现相同的功能。 - Tejas
@M.Deinum 那我应该在URL中传递什么? - Tejas
如前所述,请求参数中有一个名为“page”的参数,用于指定您想要查看的页码。 - M. Deinum
显示剩余6条评论
4个回答

47

Pageable的构造函数已经被弃用,请使用of()代替:

Pageable pageable = PageRequest.of(0, 20);

我的Spring版本中不存在这个,我该如何创建一个可分页的对象来限制查询为1? - Dimitri Kopriwa

34

我上周看到过类似的问题,但找不到了,所以我直接回答。

你的问题是你太晚指定参数了。 Pageable 的工作方式如下:您创建具有某些属性的Pageable对象。您至少可以指定:

  1. 页面大小,
  2. 页面编号,
  3. 排序。

因此,让我们假设我们有:

PageRequest p = new PageRequest(2, 20);

传递到查询中的上述内容将过滤结果,以便仅返回第21到40个结果。

您不会在结果上应用 Pageable 。您需要将它与查询一起传递。

编辑:

PageRequest的构造函数已弃用。请使用 Pageable pageable = PageRequest.of(2,20);


1
注意:索引是从零开始的页面索引。 - rbawaskar
2
new PageRequest() 构造函数已被弃用 - J3ernhard
如何将页面大小设置为无限制? - Sandeep Kumar
@SandeepKumar,你说设置无限页面大小是什么意思? - xenteros
1
请使用 PageRequest.of 而不是构造函数。 - masterxilo
显示剩余4条评论

1

你可以使用Page、List或Slice。

如果你不需要页面数量,只需要知道下一页是否存在,那么使用Slice,因为它不会执行“count”查询:

  for (int i = 0;  ; i++) { 
     Slice<Organization> pageOrganization = organizationRepository.find(PageRequest.of(0, 100));        
    
    
     List<Organization> organizationList = pageOrganization.getContent();
     for (Organization org : organizationList) {
           // code
     }
    
    if (!pageOrganization.hasNext()) {
        break;
    }   
}

0

Pageable对象默认大小为20,第0页,未排序。 因此,如果您想在前端获取下一页,可以通过查询参数page、size、sort发送URL,并且您可以在Postman上进行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接