今天项目后台须要使用分页技术查询关系库,故搜集了一些资料研究了一下,整理以下: spring
一、以前的Repository接口都继承了CRUDRepository,若是但愿仓库提供分页和排序方法,能够继承接口PagingAndSortingRepository接口。它提供了两个默认方法: 编程
Sort对象指定了对实体的哪几个属性进行排序,和排序方向(ASC默认升序,DESC降序);Page<T>很强大,不只包含了数据自己,还包含是否是第一页或是否是最后一页以及一共多少页等。 函数
二、若是不使用上述函数,咱们的Repository没必要继承PagingAndSortingRepository接口。能够像以前那样继承CRUDRepository,在须要使用分页技术的函数中添加一个Pageable参数,并把返回值设为Page<T>便可。例如 学习
Page<T> findByAddress(String address, Pageable page); 测试
或者加入Sort参数,把返回值设置为Iterable<T>。 spa
三、在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吧。 接口
四、最后是参数转换规则,默认的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中也没找到,是本身试出来的,写的不必定全面,欢迎你们在帖子下面讨论一下,相互学习。