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

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

1. обзор

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

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

В этом руководствеwe’ll learn how to easily paginate and sort using Spring Data JPA.

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

Spring Data JPA @Query

Узнайте, как использовать аннотацию @Query в Spring Data JPA для определения пользовательских запросов с использованием JPQL и собственного SQL.

Read more

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

Изучите механизм формирования запросов в Spring Data JPA.

Read more

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

Сначала предположим, что у нас есть объектProduct:

@Entity
public class Product {

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

    // constructors, getters and setters

}

как наш класс домена. Каждый из наших экземпляровProduct имеет уникальный идентификатор -id, связанные с нимname иprice.

3. Создание хранилища

Для доступа к нашемуProducts нам понадобитсяProductRepository:

public interface ProductRepository extends PagingAndSortingRepository {

    List findAllByPrice(double price, Pageable pageable);
}

Расширяя егоPagingAndSortingRepository, we get findAll(Pageable pageable) and findAll(Sort sort) methods for paging and sorting.

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

Как только мы расширимPagingAndSortingRepository,we can add our own methods that take Pageable and Sort as parameters, как мы сделали здесь сfindAllByPrice.

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

4. пагинация

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

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

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

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

Здесьthe page counts starts at zero:

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

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

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

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

Page allProducts = productRepository.findAll(firstPageWithTwoElements);

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

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

Однакоwe can choose to return either a Page<T>, a Slice<T> or a List<T> from any of our custom methods returning a paginated data.

ЭкземплярPage<T>, помимо спискаProducts, также знает об общем количестве доступных страниц. It triggers an additional count query to achieve it. To avoid such an overhead cost, we can instead return a Slice<T> or a List<T>.

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

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

Точно так же, чтобы просто отсортировать результаты нашего запроса, мы можем простоpass an instance of Sort к методу:

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

Однако что, если мы хотим, чтобыboth sort and page our data?

Мы можем сделать это, передав детали сортировки в сам объект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")));

В соответствии с нашими требованиями к сортировкеwe can specify the sort fields and the sort direction при создании нашего экземпляраPageRequest.

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

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

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

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