使用Spring Data JPA进行数据分页与排序

file

1、导读

若是一次性加载成千上万的列表数据,在网页上显示将十分的耗时,用户体验很差。因此处理较大数据查询结果展示的时候,分页查询是必不可少的。分页查询必然伴随着必定的排序规则,不然分页数据的状态很难控制,致使用户可能在不一样的页看到同一条数据。那么,本文的主要内容就是给你们介绍一下,如何使用Spring Data JPA进行分页与排序。前端

2、实体定义

咱们使用一个简单的实体定义:Article(文章)spring

@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方法、构造函数等实体类的模板代码。

3、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);
}

4、实现分页

 Pageable 是Spring定义的接口,用于分页参数的传递,咱们看看如何使用它。首先将ArticleRepository注入到你须要进行持久层操做的类里面,一般是一个@Service注解的类,而后在服务方法内使用以下代码进行分页操做:查询第一页(从0开始)的数据,每页10条数据。springboot

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)对象里面都可以获取到(下文中有介绍)。函数

5、实现排序

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"));

6、Slice与Page

在ArticleRepository咱们看到了一个方法返回Slice和另外一个方法返回了Page。它们都是Spring Data JPA的数据响应接口,其中 Page 是 Slice的子接口。它们都用于保存和返回数据。大数据

6.1.Slice

让咱们看一下 Slice的一些重要方法。ui

List <t>  getContent(); //获取切片的内容

Pageable  getPageable(); //当前切片的分页信息

boolean  hasContent(); //是否有查询结果?

boolean  isFirst();  //是不是第一个切片

boolean  isLast();  //是不是最后一个切片

Pageable nextPageable(); // 下一个切片的分页信息

Pageable previousPageable(); // 上一个切片的分页信息

6.2.Page

 Page是Slice的子接口,如下是的一些重要方法。.net

//总页数
int getTotalPages();

//总数据条数
long getTotalElements();

那么,何时使用Slice?何时使用Page? 答:经过这两个接口的函数定义能够看出,Slice只关心是否是存在下一个分片(分页),不会去数据库count计算总条数、总页数。因此比较适合大数据量列表的的鼠标或手指滑屏操做,不关心总共有多少页,只关心有没有下一页。Page比较适合传统应用中的table开发,须要知道总页数和总条数。插件

期待您的关注

相关文章
相关标签/搜索