一、导读

如果一次性加载成千上万的列表数据,在网页上显示将十分的耗时,用户体验不好。所以处理较大数据查询结果展现的时候,分页查询是必不可少的。分页查询必然伴随着一定的排序规则,否则分页数据的状态很难控制,导致用户可能在不同的页看到同一条数据。那么,本文的主要内容就是给大家介绍一下,如何使用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开发,需要知道总页数和总条数。

期待您的关注

使用Spring Data JPA进行数据分页与排序的更多相关文章

  1. spring data JPA 中的多属性排序

    在此介绍我所用的一种方式: 第一步,引包 import org.springframework.data.domain.Sort;import org.springframework.data.dom ...

  2. 【Spring Data 系列学习】Spring Data JPA 自定义查询,分页,排序,条件查询

    Spring Boot Jpa 默认提供 CURD 的方法等方法,在日常中往往时无法满足我们业务的要求,本章节通过自定义简单查询案例进行讲解. 快速上手 项目中的pom.xml.application ...

  3. JPA && Spring Data && Spring Data JPA

    1.JPA  Java Persistence API,用于对象持久化的一组API,JPA本身是一组规范,让开发者用同一种方式访问不同的ORM框架.其实也就是java实体对象和关系型数据库建立起映射关 ...

  4. Spring Boot 应用系列 1 -- Spring Boot 2 整合Spring Data JPA和Druid,双数据源

    最近Team开始尝试使用Spring Boot + Spring Data JPA作为数据层的解决方案,在网上逛了几圈之后发现大家并不待见JPA,理由是(1)MyBatis简单直观够用,(2)以Hib ...

  5. 初入spring boot(七 )Spring Data JPA

    Spring Data JPA通过提供基于JPA的Repository极大地减少JPA作为数据访问方案的代码量. 1.定义数据访问层 使用Spring Data JPA建立数据访问层十分简单,只需定义 ...

  6. Spring Data JPA应用之常规CRUD操作初体验

    基于对于一个陌生的技术框架,先使用后研究其实现的原则(大部分本人如此,就如小朋友学习骑自行车不会先研究自行车是怎么动起来的而是先骑会了),对于Spring JPA先通过案例实践其怎么用吧. 用之前得明 ...

  7. 整合Spring Data JPA与Spring MVC: 分页和排序

    之前我们学习了如何使用Jpa访问关系型数据库.比较完整Spring MVC和JPA教程请见Spring Data JPA实战入门,Spring MVC实战入门. 通过Jpa大大简化了我们对数据库的开发 ...

  8. Spring Data Jpa 实现分页(Spring MVC+easyui)

    spring data jpa很好的对dao层进行了封装,这篇文章主要来写的是实现easyui datagird数据分页,由于各个UI参数不大一样,所以如果使用的是其他UI,得稍作修改.需要说明的是我 ...

  9. spring data jpa 分页查询

    https://www.cnblogs.com/hdwang/p/7843405.html spring data jpa 分页查询   法一(本地sql查询,注意表名啥的都用数据库中的名称,适用于特 ...

随机推荐

  1. IDEA 学习笔记之 Python项目开发

    Python项目开发: 下载Python: https://www.python.org/downloads/release/python-363/ 安装Python: 配置环境变量(path): C ...

  2. 【JavaScript】 控制自适应高度

    <iframe src="需要连接的iframe地址" id="iframepage" name="iframepage" frame ...

  3. IntelliJ IDEA下载安装及破解(100%成功)教程

    原文链接:http://www.studyshare.cn/software/details/1182/0 一.下载 1.IntelliJ IDEA下载 网盘下载:https://pan.baidu. ...

  4. vue常见问题随笔集

    1.vuex操作对应关系 设置          触发/获取 action <-> dispatch mutations <-> commit getters <-> ...

  5. 了解ajax基本爬取方式

    '''爬去豆瓣电影数据了解ajax的基本爬去方式 ''' from urllib import requestimport jsonimport ssl url = "https://mov ...

  6. VM虚拟机启动夜神模拟器卡99%解决办法

    VM虚拟机启动夜神模拟器卡99%解决办法 本人出现的情况: 物理机装的是win7系统,安装了vmware14(安装过程未出现报错),在vmware14 上 win10系统(安装过程未出现报错),安装夜 ...

  7. 初学 Spring MVC(基于 Spring in Action)

    Spring MVC(Model-View-Controller) 当你看到本博文时,我猜你可能正面临着我已探索过的问题. 同其他博主一样,我先按照书上详细的介绍一下 Spring MVC,也是为了自 ...

  8. Windows 批处理入门

    Windows 批处理入门   目录 本教程概述 用到的工具 标签 简介 1.命令简介 2.符号简介 3.语句结构 4.实例讲解 本教程概述 本课我们学习windows批处理 用到的工具 cmd.ex ...

  9. [Luogu3070][USACO13JAN]岛游记Island Travels

    题目描述 Farmer John has taken the cows to a vacation out on the ocean! The cows are living on N (1 < ...

  10. opencv::点多边形测试

    点多边形测试 测试一个点是否在给定的多边形内部,边缘或者外部 double pointPolygonTest( InputArray contour, // 输入的轮廓 Point2f pt, // ...