Как реализовать пагинацию в REST API с использованием Spring Data JPA?

«Как реализовать пагинацию в REST API с использованием Spring Data JPA?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Паганация — это разбиение большого набора данных на отдельные страницы (chunks). В Spring Data JPA это реализуется с помощью интерфейсов Pageable и Page.

Базовая реализация на стороне сервера:

  1. Контроллер: Принимает параметры page (номер страницы, с 0) и size (размер страницы).

    @RestController
    @RequestMapping("/api/products")
    public class ProductController {
        @GetMapping
        public Page<Product> getProducts(Pageable pageable) {
            return productRepository.findAll(pageable);
        }
    }

    Запрос: GET /api/products?page=0&size=20&sort=name,asc

  2. Репозиторий: Spring Data JPA автоматически поддерживает пагинацию в методах, возвращающих Page<T>, Slice<T> или List<T>.

    public interface ProductRepository extends JpaRepository<Product, Long> {
        Page<Product> findByCategory(String category, Pageable pageable);
    }

Структура ответа Page: Ответ содержит не только данные, но и метаинформацию:

{
  "content": [ ... ], // Массив элементов на текущей странице
  "pageable": { ... },
  "totalPages": 50,
  "totalElements": 1000,
  "size": 20,
  "number": 0, // Текущий номер страницы
  "first": true,
  "last": false,
  "empty": false
}

Дополнительные возможности:

  • Slice: Возвращает данные и информацию о наличии следующей страницы, но без подсчета общего количества элементов (более эффективно).
  • Кастомные запросы с пагинацией: Использование @Query с параметром Pageable.
  • Клиентская реализация: На основе метаданных из ответа Page можно построить навигацию (номера страниц) или бесконечную прокрутку (infinite scroll).