Рубрики
Без рубрики

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

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

Автор оригинала: Shubhra Srivastava.

1. Обзор

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

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

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

Дальнейшее чтение:

Весенние данные JPA @Query

Производные методы запросов в репозиториях Spring Data JPA

2. Начальная настройка

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

@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 {

    List findAllByPrice(double price, Pageable pageable);
}

Если он расширит | PagingAndSortingRepository , мы получим findAll(Pageable pageable) и findAll(Sort sort) методы подкачки и сортировки.

И наоборот, мы могли бы вместо этого расширить JpaRepository , поскольку он также расширяет PagingAndSortingRepository .

Как только мы расширим PagingAndSortingRepository , мы можем добавить наши собственные методы , которые принимают Pageable и Sort в качестве параметров , как мы сделали здесь с findAllByPrice .

Давайте посмотрим, как разбить наш Продукт на страницы, используя наш новый метод.

4. Разбиение на страницы

Как только наш репозиторий расширится из PagingAndSortingRepository , нам просто нужно:

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

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

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

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

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

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

Как только у нас будет объект Page Request , мы сможем передать его при вызове метода нашего репозитория:

Page allProducts = productRepository.findAll(firstPageWithTwoElements);

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

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

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

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

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

5. Разбиение на страницы и сортировка

Аналогично, чтобы просто отсортировать результаты наших запросов, мы можем просто передать экземпляр сортировки методу:

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

Однако что делать, если мы хотим сортировать и просматривать наши данные?

Мы можем сделать это, передав детали сортировки в наш Запрос страницы сам объект:

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

Основываясь на ваших требованиях к сортировке, мы можем указать поля сортировки и направление сортировки при создании вашего Запроса страницы экземпляра.

Как обычно, мы можем передать этот экземпляр Pageable type методу репозитория.

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

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

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