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类型实例传递给存储库的方法。