Перейти к основному содержимому

Разбиение на страницы и сортировка с использованием Spring Data JPA

· 3 мин. чтения

1. Обзор

Разбиение на страницы часто полезно, когда у нас есть большой набор данных, и мы хотим представить его пользователю небольшими порциями.

Кроме того, нам часто нужно сортировать эти данные по некоторым критериям при подкачке.

В этом руководстве мы узнаем, как легко разбивать на страницы и сортировать с помощью Spring Data JPA.

2. Первоначальная настройка

Во-первых, предположим, что у нас есть объект Product в качестве класса предметной области:

@Entity 
public class Product {

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

// constructors, getters and setters

}

Каждый экземпляр нашего Продукта имеет уникальный идентификатор: id , его имя и связанную с ним цену .

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 .

Давайте посмотрим, как разбивать на страницы наши Product с помощью нашего нового метода.

4. Пагинация

Когда у нас есть репозиторий, расширяющийся от PagingAndSortingRepository , нам просто нужно:

  1. Создайте или получите объект PageRequest , который является реализацией интерфейса Pageable.
  2. Передайте объект PageRequest в качестве аргумента методу репозитория, который мы собираемся использовать.

Мы можем создать объект PageRequest , передав запрошенный номер страницы и размер страницы.

Здесь количество страниц начинается с нуля:

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

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

В Spring MVC мы также можем получить экземпляр Pageable в нашем контроллере с помощью Spring Data Web Support .

Получив объект PageRequest , мы можем передать его при вызове метода нашего репозитория:

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

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

Метод findAll(Pageable pageable) по умолчанию возвращает объект Page<T> .

Однако мы можем выбрать возврат Page<T>, Slice <T> или List<T> из любого из наших пользовательских методов, возвращающих данные с разбивкой на страницы .

Экземпляр Page<T> , помимо списка Product , также знает об общем количестве доступных страниц. Он запускает дополнительный запрос подсчета для его достижения. Чтобы избежать таких накладных расходов, мы можем вместо этого вернуть Slice<T> или List<T> .

Слайс знает только, доступен ли следующий слайс или нет.

5. Пагинация и сортировка

Точно так же, чтобы просто отсортировать результаты нашего запроса, мы можем просто передать экземпляр 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 методу репозитория.

6. Заключение

В этой статье мы узнали, как разбивать на страницы и сортировать результаты нашего запроса в Spring Data JPA.

Как всегда, полные примеры кода, используемые в этой статье, доступны на Github .