Spring Boot
2026-02-26 16:46 Diff

В этом уроке мы подробнее обсудим JpaRepository — он устроен интереснее, чем может показаться на первый взгляд. С одной стороны, он предоставляет множество полезных встроенных методов, а с другой — поддерживает автоматическую генерацию кастомных методов для извлечения данных. Далее мы разберем эти возможности.

CRUD-операции

Сюда входит базовый набор методов для создания, обновления, удаления и выборки данных:

  • Метод S save(S entity) сохраняет данные в базу:

  • Метод Optional<T> findById(ID id) извлекает сущность по id:

  • Метод List<T> findAll() возвращает список всех сущностей, что полезно для справочников и других небольших таблиц:

  • Метод long count() возвращает количество сущностей, то есть записей в таблице:

  • Метод void deleteById(ID id) удаляет сущность (запись в базе) по id

  • Метод void delete(T entity) удаляет переданную сущность из базы данных:

Derived Query Methods

Одна из типовых задач — это выборка по определенному полю или набору полей. Spring Data JPA автоматически генерирует методы, выполняющие подобные выборки. Для этого надо добавить определение нужного метода или методов:

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

Сортировка

Сортировка данных выполняется с помощью комбинации методов и вложенных классов Sort:

Сортировка по возрастанию выполняется с помощью Sort.Order.asc(), по убыванию — с помощью Sort.Order.desc().

Пагинация

Пагинация — это выборка только определенного среза данных с помощью конструкции LIMIT OFFSET. Это основной способ выборки наборов данных, потому что полные наборы обычно слишком большие — извлекать их целиком неудобно:

Обычно текущая страница приходит как параметр запроса. По умолчанию страница равна единице. Это не совпадает с тем, как работает PageRequest — он отображается напрямую на OFFSET, где базовое значение равно 0. Поэтому для правильной работы пагинации нужно выполнить две задачи:

  • Установить 1 в качестве значения параметра запроса page по умолчанию
  • При формировании PageRequest вычитать единицы из page

Объединение пагинации и сортировки

Если нужно объединить пагинацию и сортировку, можно задавать сортировку через PageRequest. В итоге код будет выглядеть так:

Кастомные запросы

Выше мы перечислили множество разных вариантов. Несмотря на это, в некоторых ситуациях все таки придется написать SQL-код. Чтобы это сделать, нужно добавить определение метода с аннотациями @Param и @Query:

Советуем писать кастомные запросы только тогда, когда не остается другого выбора.