使用Spring Data JPA进行分页和排序


1.概述

当我们拥有大型数据集并且我们希望以较小的块呈现给用户时,分页通常很有用。

此外,我们经常需要在分页时按照某些标准对数据进行排序。

在本教程中,我们将学习如何使用Spring Data JPA轻松进行分页和排序。

2.初始设置

首先,假设我们有一个产品实体:

首先,假设我们有一个产品实体:

@Entity
public class Product {

    @Id
    private long id;
    private String name;
    private double price;

    // constructors, getters and setters

}

作为我们的域类。我们的每个产品 实例都有一个唯一的标识符 - 标识,名称和与之关联的价格。

3.创建存储库

要访问我们的产品,我们需要一个 ProductRepository:

public interface ProductRepository extends PagingAndSortingRepository<Product, Integer> {

    List<Product> findAllByPrice(double price, Pageable pageable);
}

通过扩展PagingAndSortingRepository,我们获得了 findAll(Pageable pageable)和findAll(Sort sort)方法,用于分页和排序。

或者,我们可以选择扩展 JpaRepository ,因为它也扩展了 PagingAndSortingRepository。

一旦我们扩展了PagingAndSortingRepository,我们就可以添加自己的方法,将 Pageable和 Sort作为参数,就像我们在这里使用 findAllByPrice一样。

我们来看看如何使用我们的新方法对我们的产品进行分页 。

4.分页

一旦我们从PagingAndSortingRepository扩展了我们的存储库,我们只需要:

创建或获取PageRequest对象,该对象是Pageable接口的实现 将PageRequest对象作为参数传递给我们打算使用的存储库方法 我们可以通过传入请求的页码和页面大小来创建PageRequest对象。

这里,页面计数从零开始:

Pageable firstPageWithTwoElements = PageRequest.of(0, 2);

Pageable secondPageWithFiveElements = PageRequest.of(1, 5);

在Spring MVC中,我们还可以选择使用Spring Data Web Support在我们的控制器中获取Pageable实例。

一旦我们有了PageRequest对象\,我们可以在调用我们的存储库方法时传入它:

Page<Product> allProducts = productRepository.findAll(firstPageWithTwoElements);

List<Product> allTenDollarProducts =
  productRepository.findAllByPrice(10, secondPageWithFiveElements);

默认情况下,findAll(Pageable pageable)方法返回Page <T> 对象。

然而,我们可以选择返回一个页面<T>,一个切片<T>或列表<T>从我们的任何返回分页数据的自定义方法。

一个页面<T>的实例,除了具有清单产品 S,也知道可用页面的总数。它会触发一个额外的计数查询来实现它。为了避免这种开销成本,我们可以改为返回Slice <T>或List <T>

A Slice只知道下一个切片是否可用。

5.分页和排序

同样,为了让我们的查询结果排序,我们可以简单地 将Sort的一个实例传递给方法:

同样,为了让我们的查询结果排序,我们可以简单地 将Sort的一个实例传递给方法:

Page<Product> allProductsSortedByName = productRepository.findAll(Sort.by("name"));

但是,如果我们要对数据进行排序和分页,该怎么办?

我们可以通过将排序细节传递给我们的PageRequest对象本身来实现:

Pageable sortedByName =
  PageRequest.of(0, 3, Sort.by("name"));

Pageable sortedByPriceDesc =
  PageRequest.of(0, 3, Sort.by("price").descending());

Pageable sortedByPriceDescNameAsc =
  PageRequest.of(0, 5, Sort.by("price").descending().and(Sort.by("name")));

根据我们的排序要求,我们可以在创建PageRequest实例时指定排序字段和排序方向。

像往常一样,我们可以将此Pageable类型实例传递给存储库的方法。