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 会自动进行转换。
最后更新于