page contents

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

当我们拥有大型数据集并且我们希望以较小的块呈现给用户时,分页通常很有用。 此外,我们经常需要在分页时按照某些标准对数据进行排序。 在本教程中,我们将学习如何使用Spring Data JPA轻松...

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

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

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

初始设置

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



@Entity
public class Product {

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

// constructors, getters and setters

}

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


创建存储库

要访问我们的产品,我们需要一个 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一样。

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


分页

一旦我们从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只知道下一个切片是否可用。


分页和排序

同样,为了让我们的查询结果排序,我们可以简单地 将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类型实例传递给存储库的方法。


  • 发表于 2020-01-13 14:09
  • 阅读 ( 617 )
  • 分类:Java开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章