1、我们还是使用前两篇文章的开发环境和创建的类。对于UserRepository接口,之前该类是继承JpaRepository接口,我们改成继承PagingAndSortingRepository接口,其实也可以不用修改,因为JpaRepository也继承了PagingAndSortingRepository接口,我们这样做主要是想仅仅演示分页和排序功能。
2、首先我们来介绍分页查询,在使用默认排序的情况下,调用UserRepository的findAll()方法,方法传参中创建一个分页对象,new PageRequest(currentPage-1,pageSize),currentPage为当前页,pageSize为每页条数,直接传参,(currentPage-1)*pageSize为数据库查询的offset,pageSize即为limit通过该方法可以取到当前页的数据。@GetMapping(path = "/only/page")public Page<User> getAllUserByOnlyPage(Integer currentPage, Integer pageSize) { return userRepository.findAll( new PageRequest(currentPage-1,pageSize));}
3、接下来我们创建一个方法,该方法仅仅实现排序的功能,调用UserRepository的findAll()方法,方法传参中创建一个排序对象,new Sort(new Sort.Order( Sort.Direction.ASC, sortColumn)),指定排序方法ASC为升序,sortColumn参数为排序的字段,支持传参。/** * 排序查询 * @param sortColumn */@GetMapping(path = "/only/sort")public Iterable<User> getAllUserBySort(String sortColumn) { return userRepository.findAll( new Sort(new Sort.Order( Sort.Direction.ASC, sortColumn)));}
4、分页和排序同时进行的方法,如下所示,我们在创建分页对象的时候,该对象传入排序参数即可,new PageRequest(currentPage-1, pageSize, new Sort(new Sort.Order(Sort.Direction.ASC, sortColumn))。/** * 排序和分页查询 * @param currentPage * @param pageSize * @param sortColumn * @return */@GetMapping(path = "/page")public Iterable<User> getAllUserByPageAndSort(Integer currentPage, Integer pageSize, String sortColumn) { return userRepository.findAll( new PageRequest(currentPage-1, pageSize, new Sort(new Sort.Order( Sort.Direction.ASC, sortColumn))) );}
5、如果分页和排序查询需要根据某一个字段过资鼠榘运滤该怎么做呢?此时我们就需要在UserRepository中定义根据年龄进行查询的方法了,方法为:P锾攒揉敫age<User> findByAge(Integer age, Pageable Pageable );此处涉及到后面要分享的知识点,我们此处先将代码列出,原理后面再分享。/** * 根据年龄进行分页查询 * @param age * @param currentPage * @param pageSize * @return */@GetMapping(path = "/age/page")public Page<User> getUserByAgeAndPage(Integer age, Integer currentPage, Integer pageSize) { return userRepository.findByAge( age, new PageRequest(currentPage-1,pageSize) );}
6、以上方法编写完成后,我们启动应用,接下来看看在postman中测试的结果和数据库中的数据对比,如下图所示。