Ответ
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.
- Гибкость: Создание различных представлений данных для разных сценариев.