Java for Beginner
675 subscribers
558 photos
156 videos
12 files
851 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Аннотация @Projection

Аннотация
@Projection используется в Spring Data для определения проекций - специальных интерфейсов или классов, которые позволяют выбирать только определенные поля из сущностей.

Это полезно для:
Оптимизации запросов (избегания select *)
Создания DTO на лету
Кастомизации JSON-представления REST API


Проекции находятся в пакете org.springframework.data.rest.core.config.
Projection и применяются к интерфейсам или классам.

Параметры аннотации

types (обязательный)
Тип: Class<?>[]
Описание: Указывает сущности, к которым применяется проекция


Пример:
@Projection(types = {User.class})
public interface UserSummary {
String getUsername();
String getEmail();
}


name (необязательный)
Тип: String
Описание: Задает имя проекции для использования в Spring Data REST


Пример:
@Projection(name = "summary", types = User.class)
public interface UserSummary {...}


Типы проекций

1. Интерфейсные проекции

Наиболее распространенный подход:
@Projection(types = User.class)
public interface UserView {
String getUsername();
String getEmail();

// Можно включать связанные сущности
@Value("#{target.department.name}")
String getDepartmentName();
}


2. Классовые проекции (DTO)
Используются классы вместо интерфейсов:
@Projection(types = User.class)
public class UserDto {
private final String username;
private final String email;

public UserDto(String username, String email) {
this.username = username;
this.email = email;
}

// Геттеры
}


3. Динамические проекции
Можно создавать проекции на лету через SpEL:
@Projection(types = User.class)
public interface DynamicUserView {
@Value("#{target.username + ' (' + target.email + ')'}")
String getDisplayName();
}


Жизненный цикл проекций

Объявление проекции
Создается интерфейс/класс с аннотацией @Projection
Определяются методы, соответствующие полям сущности


Использование в репозитории
Spring Data создает прокси-реализацию при выполнении запроса

Преобразование результатов
После выполнения запроса результаты маппятся на проекцию

Механизмы Spring Data

1. Автоматический маппинг

Spring Data автоматически:
Анализирует методы проекции
Создает соответствующий SQL (только выбранные поля)
Преобразует результат в проекцию


2. Интеграция с репозиториями
public interface UserRepository extends JpaRepository<User, Long> {
<T> List<T> findBy(Class<T> type);
UserSummary findSummaryById(Long id);
}


3. Поддержка в Spring Data REST

Проекции можно активировать через параметр запроса:
GET /users/1?projection=summary


Примеры использования


1. Базовый пример
@Entity
public class User {
private Long id;
private String username;
private String email;
// геттеры/сеттеры
}

@Projection(types = User.class)
public interface UserSummary {
String getUsername();
String getEmail();
}

// В репозитории
UserSummary findSummaryById(Long id);


2. Комплексная проекция
@Projection(types = {User.class, Department.class})
public interface UserDetailView {
String getUsername();

@Value("#{target.department.name}")
String getDepartmentName();

default String getDisplayInfo() {
return getUsername() + " from " + getDepartmentName();
}
}


3. Вложенные проекции
@Projection(types = Order.class)
public interface OrderView {
String getOrderNumber();

@Value("#{target.customer}")
CustomerView getCustomer();
}

@Projection(types = Customer.class)
public interface CustomerView {
String getName();
}


Настройки Spring Boot

Автоконфигурация
Spring Boot автоматически настраивает поддержку проекций через SpringDataWebConfiguration

Ручная регистрация
Можно явно зарегистрировать проекции:
@Configuration
public class ProjectionConfig {
@Bean
public ProjectionDefinitionRegistrar projectionRegistrar() {
return registrar -> {
registrar.addProjection(UserSummary.class);
};
}
}


Настройка REST

В application.properties:
spring.data.rest.default-projection=summary


#Java #Training #Hard #Spring #SpringDataJPA #Projection