Предположим, что у меня есть два связанных между собой объекта A и B, один к одному, и B вложен в A. B инициализируется и инициализируется с помощью Lazy, а также у меня есть Entity Graph, который охотно выбирает B при загрузке A следующим образом.
@NamedEntityGraph(name = "subGraph",attributeNodes = {@NamedAttributeNode("sub")})
public class A{
Integer id;
String name;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id", insertable = false, updatable = false)
B sub;
}
public class B {
int id;
String description;
}
Давайте запросим поток A из базы данных, и мы пытаемся установить объект DTO и добавить в список DTO:
1. List<ADto> dtoList = new ArrayList<>();
2.
3. aRepository.streamAll().forEach(a -> {
4. ADto dto = new ADto();
5. dto.setName(a.getName());
6. dto.setSub(a.getB());
7. })
Мой вопрос:
Если экземпляр A не имеет B (я имею в виду SQL-запрос с LEFT OUTER JOIN, поскольку Entity Graph возвращает нулевые поля для B) строка 6 выполняет второй SQL-запрос к базе данных, например
ВЫБРАТЬ proxy_b_1.id, proxy_b_1.description FROM b как proxy_b_1;
На самом деле мы уже знаем, что экземпляр B под этим конкретным экземпляром A не имеет значения. Показывается также в режиме отладки. Но почему он делает второй запрос SQL? Как я могу смягчить это? Я имею в виду, если я сделаю запрос графа сущностей, который будет достаточен для меня, если вложенный B существует. Если не существует, не выполняйте дополнительный запрос. Как я могу это сделать?