Sorting and Pagination

在之前的小节中我们了解到 JpaRepository 继承了 PagingAndSortingRepository 接口。

repo.findAll();

通常来讲,我们可以像上述代码一样来拉取全部数据,我们也可以这样:

repo.findAll(Sort.by("name"));

从而可以将结果进行排序。如果设置了 spring.jpa.show-sql: true,可以在后台看到查询语句:

Hibernate: select student0_.id as id1_0_, student0_.age as age2_0_, student0_.name as name3_0_ from student student0_ order by student0_.name asc

如果要使用函数:

repo.findAll(Sort.by("LENGTH(name)")); // Error!

默认情况下,JPA 拒绝含有任何函数的 Sort 实例。如果一定要函数的话,可以使用 JpaSort.unsafe():

repo.findAll(JpaSort.unsafe("LENGTH(name)"));

我们也可以进行分页,同样非常简单:

repo.findAll(PageRequest.of(page, size));

但是对于预定义方法,使用分页时其返回值为 Page<T> ,要取得 List<T> 使用:

repo.findAll(PageRequest.of(page. size)).getContent();

如果需要同时使用分页和排序呢?是这样吗:

repo.findAll(Sort.by("name"), PageRequest.of(page, size)); // Error!

不能同时使用分页和排序!!!

应该在分页的基础上使用分页(Spring Data JPA 会对所有数据进行排序,然后分页):

repo.findAll(PageRequest.of(page, size, Sort.by("age").descending())).getContent();

除了可以在预定义方法上使用分页和排序,也可以在自定义方法上使用

List<Student> findByName(String name, Pageable pageable);

只需要给你的自定义方法加一个 Pageable 或者 Sort 类型的参数即可。并且,自定义参数可以直接指定 List<T> 作为返回值,Spring Data JPA 会自动进行转换。

最后更新于