Ваша сущность является объектом отношений один-много.Если вы не используете EAGER, данные Spring получат объект без связанного объекта-члена.И если вы получите это с contract.getProject().getName()
, то для получения этого члена будет отправлен другой запрос.
Если вы зарегистрируете SQL, вы увидите, что будет 2 запроса.Но если вы установите поле EAGER, будет только 1 запрос.Вы можете получить улучшение, очевидно.
Но вы не должны использовать EAGER всегда.Если в 90% времени вам просто нужен объект Контракт, но не нужны данные проекта для него.Это пустая трата времени, чтобы получить это.Поскольку в SQL он будет связывать 2 таблицы и получать все столбцы данных.
ТАК, вам следует принять это решение в зависимости от использования этой сущности.
[Обновлено на основе комментариев]
Вы можете использовать Query
, чтобы написать выражение sql.Например, у меня есть метод для получения объекта с деталями:
@Query("select s from Contract s left join fetch s.project pr where s.id = ?1 ")
Contract findOneWithDetail(Long id);
Если мне нужно получить детали в ОДНОМ sql, я могу использовать этот метод.Если мне не нужны детали проекта, я просто использую findOne(Long id)
, который предоставляет интерфейс.
И, если вы просто хотите получить несколько столбцов, вам нужно определить DTO с помощью конструктора,и напишите свой метод так:
@Query("SELECT NEW com.mypackage.dto.ContractDTO(s.id, s.name, s.status) FROM Contract AS s WHERE s.status = ?1")
List<ContractDTO> findDTOAllByStatus(String status);