使用Spring Data JPA进行数据分页与排序
一、导读
如果一次性加载成千上万的列表数据,在网页上显示将十分的耗时,用户体验不好。所以处理较大数据查询结果展现的时候,分页查询是必不可少的。分页查询必然伴随着一定的排序规则,否则分页数据的状态很难控制,导致用户可能在不同的页看到同一条数据。那么,本文的主要内容就是给大家介绍一下,如何使用spring data jpa进行分页与排序。
二、实体定义
我们使用一个简单的实体定义:article(文章)
@data @allargsconstructor @noargsconstructor @builder @entity @table(name="article") public class article { @id @generatedvalue private long id; @column(nullable = false,length = 32) private string author; @column(nullable = false, unique = true,length = 32) private string title; @column(length = 512) private string content; private date createtime; }
- @entity 表示这个类是一个实体类,接受jpa控制管理,对应数据库中的一个表
- @table 指定这个类对应数据库中的表名。如果这个类名和数据库表名符合驼峰及下划线规则,可以省略这个注解。如flowtype类名对应表名flow_type。
- @id 指定这个字段为表的主键
- @generatedvalue(strategy=generationtype.identity) 指定主键的生成方式,一般主键为自增的话,就采用generationtype.identity的生成方式
- @column 注解针对一个字段,对应表中的一列。nullable = false表示数据库字段不能为空, unique = true表示数据库字段不能有重复值,length = 32表示数据库字段最大程度为32.
- @data、@allargsconstructor、@noargsconstructor、@builder都是插件lombok的注解,用来帮助我们生成set、get方法、构造函数等实体类的模板代码。
三、repository定义
定义一个接口articlerepository继承 pagingandsortingrepository。pagingandsortingrepository接口不仅包含基础的curd函数,还支持排序、分页的接口函数定义。
public interface articlerepository extends pagingandsortingrepository<article,long> { //查询article表的所有数据,传入pageable分页参数,不需要自己写sql page<article> findall(pageable pageable); //根据author字段查询article表数据,传入pageable分页参数,不需要自己写sql page<article> findbyauthor(string author, pageable pageable); //根据author字段和title字段,查询article表数据,传入pageable分页参数,不需要自己写sql slice<article> findbyauthorandtitle(string author, string title, pageable pageable); }
四、实现分页
pageable 是spring定义的接口,用于分页参数的传递,我们看看如何使用它。首先将articlerepository注入到你需要进行持久层操作的类里面,通常是一个@service注解的类,然后在服务方法内使用如下代码进行分页操作:查询第一页(从0开始)的数据,每页10条数据。
pageable pageable = pagerequest.of(0, 10); //第一页 //pageable pageable = pagerequest.of(0, 10); //第二页 //pageable pageable = pagerequest.of(0, 10); // 第三页 //数据库操作获取查询结果 page<article> articlepage = articlerepository.findall(pageable); //将查询结果转换为list list<article> articlelist = articlepage.getcontent();
findall方法以page类的对象作为响应,如果我们想获取查询结果list,可以使用getcontent()方法。但是笔者不建议这样进行转换,因为前端展示一个分页列表,不仅需要数据,而且还需要一些分页信息。如:当前第几页,每页多少条,总共多少页,总共多少条。这些信息在page(articlepage)对象里面均可以获取到(下文中有介绍)。
五、实现排序
spring data jpa提供了一个 sort
对象,用以提供一种排序机制。让我们看一下排序的方式。
articlerepository.findall(sort.by("createtime")); articlerepository.findall(sort.by("author").ascending() .and(sort.by("createtime").descending()));
- 第一个findall方法是按照createtime的升序进行排序
- 第一个findall方法是按照author的升序排序,再按照createtime的降序进行排序
分页和排序在一起
pageable pageable = pagerequest.of(0, 10,sort.by("createtime"));
六、slice与page
在articlerepository我们看到了一个方法返回slice和另一个方法返回了page。它们都是spring data jpa的数据响应接口,其中 page 是 slice的子接口。它们都用于保存和返回数据。
6.1.slice
让我们看一下 slice的一些重要方法。
list <t> getcontent(); //获取切片的内容 pageable getpageable(); //当前切片的分页信息 boolean hascontent(); //是否有查询结果? boolean isfirst(); //是否是第一个切片 boolean islast(); //是否是最后一个切片 pageable nextpageable(); // 下一个切片的分页信息 pageable previouspageable(); // 上一个切片的分页信息
6.2.page
page是slice的子接口,以下是的一些重要方法。
//总页数 int gettotalpages(); //总数据条数 long gettotalelements();
那么,什么时候使用slice?什么时候使用page?
答:通过这两个接口的函数定义可以看出,slice只关心是不是存在下一个分片(分页),不会去数据库count计算总条数、总页数。所以比较适合大数据量列表的的鼠标或手指滑屏操作,不关心总共有多少页,只关心有没有下一页。page比较适合传统应用中的table开发,需要知道总页数和总条数。
期待您的关注
- 博主最近新写了一本书:《手摸手教您学习springboot系列-16章97节》
- 本文转载注明出处(必须带连接,不能只转文字):。
上一篇: 确实好孝
推荐阅读
-
使用Spring Data JPA进行数据分页与排序
-
Spring Data JPA使用Sort进行排序(Using Sort)
-
Spring Data数据持久化API JPA的使用
-
Spring data jpa的使用与详解(复杂动态查询及分页,排序)
-
在Spring Boot中使用Spring-data-jpa实现分页查询
-
使用spring-data-jpa进行count时报错No property count found for type xxx的解决方案
-
Spring Data Jpa使用@Version进行数据库乐观锁控制注意事项
-
使用Spring Data JPA 获取数据库数据
-
Spring Data JPA中分别使用Specifications、ExampleMatcher进行查询
-
使用Spring Data JPA进行数据分页与排序