Что такое Repository в Spring Data JPA и как его использовать?

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

Ответ

Repository в Spring Data JPA — это абстракция над слоем доступа к данным, которая минимизирует шаблонный код. Это интерфейс, расширяющий один из базовых репозиториев (JpaRepository, CrudRepository, PagingAndSortingRepository).

Основные возможности:

  • Автогенерация запросов по именам методов.
  • Поддержка кастомных JPQL/SQL-запросов через @Query.
  • Встроенная пагинация и сортировка.
  • Интеграция с транзакционностью Spring.

Пример объявления и использования:

// 1. Объявление интерфейса репозитория
public interface UserRepository extends JpaRepository<User, Long> {
    // Автогенерируемый запрос по имени метода
    List<User> findByEmail(String email);

    // Кастомный запрос с JPQL
    @Query("SELECT u FROM User u WHERE u.active = true")
    List<User> findAllActiveUsers();

    // Нативный SQL-запрос
    @Query(value = "SELECT * FROM users WHERE registration_date > :date", nativeQuery = true)
    List<User> findUsersRegisteredAfter(@Param("date") LocalDate date);
}

// 2. Использование в сервисе
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public User getUserByEmail(String email) {
        return userRepository.findByEmail(email).stream().findFirst().orElse(null);
    }
}

Плюсы:

  • Резкое сокращение boilerplate-кода.
  • Типобезопасность.
  • Легкая тестируемость (можно использовать @DataJpaTest).

Нюансы и решения:

  • Проблема N+1 при ленивой загрузке коллекций. Решается с помощью @EntityGraph для указания fetch-стратегии.
  • Для сложных динамических запросов часто удобнее использовать QueryDSL или JPA Criteria API.
  • Для операций, затрагивающих много строк, может быть эффективнее JdbcTemplate или нативные запросы с модификатором @Modifying.