0Pricing
Java Academy · Урок

Репозитории 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 — локальная установка не требуется.

Все уроки этого курса

  1. Отображение сущностей с аннотациями JPA
  2. Репозитории Spring Data и методы запросов
  3. Связи один-ко-многим и многие-ко-многим
  4. Пагинация, сортировка и проекции
← Назад к Java Academy