Spring data jpa 分页技术

今天项目后台需要使用分页技术查询关系库,故搜集了一些资料研究了一下,整理如下:

1、之前的Repository接口都继承了CRUDRepository,如果希望仓库提供分页和排序方法,可以继承接口PagingAndSortingRepository接口。它提供了两个默认方法:

  • findAll(Sort)使用Sort提供的排序指令对所有实体进行排序查询,返回Iterable<T>;
  • findAll(Pageable)使用Pageable中的Sort对象对实体排序查询,并使用Pageable的getPageSize()(每页的元素个数)和getPageNumber()(想要获得的页序号)两个方法返回的值返回分页的对象:Page<T>。

Sort对象指定了对实体的哪几个属性进行排序,和排序方向(ASC默认升序,DESC降序);Page<T>很强大,不仅包含了数据本身,还包含是不是第一页或是不是最后一页以及一共多少页等。


2、如果不使用上述函数,我们的Repository不必继承PagingAndSortingRepository接口。可以像之前那样继承CRUDRepository,在需要使用分页技术的函数中添加一个Pageable参数,并把返回值设为Page<T>即可。例如

Page<T> findByAddress(String address, Pageable page);

或者加入Sort参数,把返回值设置为Iterable<T>。


3、在Web应用中,通常不需要自己创建Pageable对象,Spring Data提供了两个HandlerMethodArgumentResolver实现:

PageableHandlerMethodArgumentResolver和SortHandlerMethodArgumentResolver,它们可以将HTTP请求参数转换为Pageable和Sort对象。

我使用的是编程的方式配置spring,在相应的WebMvcConfigurerAdapter继承类上使用@EnableSpringDataWebSupport注解,它将注册上文提到的两个MethodArgumentResolver,用于将请求参数转换为Pageable和Sort对象。

通过@EnableSpringDataWebSupport注解注册的两个bean包含了一些默认设置,包括解析的参数名称等。如果这些不满足需求,可以去掉该注解,覆盖WebMvcConfigurerAdapter的addArgumentResolvers(List<HandlerMethodArgumentResolver>)方法,自己创建上述两个Resolver并设置他们的属性,具体配置参考Spring data API吧。


4、最后是参数转换规则,默认的Pageable pageNumber属性对应的参数名是page(页数从0开始,即page=2查询的是第三页), pageSize对应的参数名是size,Sort对象对应的参数名是sort。经过我自己测试sort参数的格式是 “属性名,...,ASC/DESC”。即前面指定一个或者多个排序的属性,最后指定方向,都用逗号分隔,如果不指定排序方向默认是ASC。可能有些抽象,来看一个例子:

对于User实体,每页10个User,查询第3页,按id属性降序排列的参数可以这么写:

......../users?size=10&page=2&sort=id,desc


后记:上网搜集资料时发现,讨论分页技术的相关文章不是很多且大多数不够深入,用编程方式配置Spring的更是少之又少。像是sort参数的格式,没有找到相关的文章、API中也没找到,是自己试出来的,写的不一定全面,欢迎大家在帖子下面讨论一下,相互学习。

转载于:https://my.oschina.net/u/2453016/blog/552271

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值