Репозитории Spring Data и методы запросов
Расширяйте JpaRepository, определяйте методы запросов по соглашениям об именовании и используйте @Query для пользовательского JPQL.
«Репозитории Spring Data и методы запросов» — бесплатный урок Java Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.
Репозитории Spring Data JPA
Расширьте JpaRepository<Entity, ID>, чтобы бесплатно получить методы CRUD, разбиения на страницы и сортировки. Spring создаёт реализацию при запуске — SQL или шаблонный код DAO не требуется.
public interface UserRepository extends JpaRepository<User, Long> {
// Free: findAll, findById, save, delete, count, existsById, etc.
}Производные методы запросов
Spring Data создаёт запросы на основе имён методов. Соглашение об именовании выглядит так: findBy + свойство + необязательные условия.
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByStatus(UserStatus status);
Optional<User> findByEmail(String email);
List<User> findByAgeGreaterThanAndStatusOrderByNameAsc(int age, UserStatus s);
boolean existsByEmail(String email);
long countByStatus(UserStatus status);
}Поддерживаемые ключевые слова в именах методов
Основные ключевые слова именования: And, Or, Is/Equals, Between, LessThan/GreaterThan, Like/NotLike, In/NotIn, IsNull/IsNotNull, OrderBy, First/Top.
List<User> findTop5ByStatusOrderByCreatedAtDesc(UserStatus s);
List<User> findByNameContainingIgnoreCase(String fragment);
List<User> findByCreatedAtBetween(LocalDateTime from, LocalDateTime to);@Query для пользовательских запросов JPQL
Используйте @Query для сложных запросов, которые нельзя выразить именами методов. JPQL использует имена классов сущностей и полей, а не имена таблиц и столбцов.
@Query("SELECT u FROM User u WHERE u.email = :email AND u.status = :status")
Optional<User> findActiveByEmail(@Param("email") String email,
@Param("status") UserStatus status);
@Query("SELECT u.name, COUNT(o) FROM User u JOIN u.orders o GROUP BY u.name")
List<Object[]> countOrdersPerUser();Нативные запросы
Используйте nativeQuery = true, чтобы писать необработанный SQL. Это полезно для функций, специфичных для базы данных, таких как ON CONFLICT, оконные функции или полнотекстовый поиск.
@Query(value = "SELECT * FROM users WHERE tsv @@ plainto_tsquery(:q)",
nativeQuery = true)
List<User> fullTextSearch(@Param("q") String query);Изменяющие запросы с @Modifying
Помечайте запросы на обновление и удаление аннотацией @Modifying. Добавляйте @Transactional, поскольку для изменяющих запросов требуется активная транзакция.
@Modifying
@Transactional
@Query("UPDATE User u SET u.status = :s WHERE u.lastLogin < :cutoff")
int deactivateInactiveUsers(@Param("s") UserStatus s,
@Param("cutoff") LocalDateTime cutoff);Производные методы удаления
Spring Data также создаёт запросы на удаление на основе имён методов — это удобно для операций очистки.
void deleteByStatus(UserStatus status);
long deleteByCreatedAtBefore(LocalDateTime cutoff);Срезы репозиториев: CrudRepository, PagingAndSortingRepository
Используйте более узкие базовые интерфейсы, если вам не нужны все методы JpaRepository. CrudRepository содержит базовые операции CRUD; PagingAndSortingRepository добавляет findAll(Pageable).
public interface ReadOnlyUserRepository extends PagingAndSortingRepository<User, Long> {
// Only paging + sorting — no save/delete
}@EntityGraph для оптимизации загрузки
Используйте @EntityGraph, чтобы переопределить стратегию загрузки по умолчанию для конкретного запроса и загружать связи жадно, не изменяя сопоставление сущности.
@EntityGraph(attributePaths = {"orders", "orders.items"})
@Query("SELECT u FROM User u WHERE u.id = :id")
Optional<User> findWithOrders(@Param("id") Long id);Пользовательские реализации репозиториев
Добавьте пользовательский метод, создав интерфейс и класс реализации по соглашению об именовании UserRepositoryCustom + UserRepositoryCustomImpl. Spring объединит их.
public interface UserRepositoryCustom {
List<User> searchByCriteria(UserSearchCriteria criteria);
}
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
@PersistenceContext EntityManager em;
public List<User> searchByCriteria(UserSearchCriteria c) {
// use Criteria API or JdbcTemplate
}
}
public interface UserRepository extends JpaRepository<User,Long>, UserRepositoryCustom {}Быстрая проверка
Какая аннотация требуется вместе с @Query для операторов UPDATE/DELETE?
Итоги
Расширяйте JpaRepository, чтобы бесплатно получить CRUD. Используйте производные имена методов для простых запросов. Используйте @Query для сложного JPQL или нативного SQL. Применяйте @Modifying+@Transactional для обновлений. Используйте @EntityGraph для настройки загрузки.
Часто задаваемые вопросы
Урок «Репозитории Spring Data и методы запросов» бесплатный?
Да — полный текст урока «Репозитории Spring Data и методы запросов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.
Чему я научусь в уроке «Репозитории Spring Data и методы запросов»?
Расширяйте JpaRepository, определяйте методы запросов по соглашениям об именовании и используйте @Query для пользовательского JPQL. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Java Academy?
Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Репозитории Spring Data и методы запросов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Java Academy?
Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Отображение сущностей с аннотациями JPA
- Репозитории Spring Data и методы запросов
- Связи один-ко-многим и многие-ко-многим
- Пагинация, сортировка и проекции