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
, нам просто нужно:
- Создайте или получите объект
PageRequest
, который является реализацией интерфейсаPageable.
- Передайте объект
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 .