Что такое Projection в Spring Data и для чего она используется?

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

Ответ

Projection (Проекция) в Spring Data — это механизм для выборки только определенного подмножества полей сущности. Это оптимизирует запросы, уменьшая объем передаваемых из БД данных и нагрузку на ORM.

1. Проекция на основе интерфейса (Interface-based Projection) Создается интерфейс с геттерами, имена которых соответствуют полям сущности.

public interface UserSummary {
    String getUsername();
    String getEmail();
}

Использование в репозитории:

public interface UserRepository extends JpaRepository<User, Long> {
    List<UserSummary> findByActiveTrue(); // Spring Data сгенерирует запрос только для username и email
}

2. Проекция на основе класса (Class-based / DTO Projection) Используется JPQL конструктор или Spring SpEL.

@Value // Lombok, создает immutable DTO
public class UserDto {
    String username;
    String email;
}
@Query("SELECT new com.example.dto.UserDto(u.username, u.email) FROM User u")
List<UserDto> findUserDtos();

3. Динамические проекции (Dynamic Projections) Тип проекции передается как параметр класса.

<T> T findUserById(Long id, Class<T> type);
// Использование:
User entity = repo.findUserById(1L, User.class);
UserSummary projection = repo.findUserById(1L, UserSummary.class);

Преимущества:

  • Производительность: БД передает и ORM материализует только нужные колонки.
  • Безопасность: Исключение чувствительных полей (например, паролей) из ответа API.
  • Гибкость: Создание различных представлений данных для разных сценариев.