JPA Lazy with Entity Graph делает дополнительные запросы - PullRequest
0 голосов
/ 30 июня 2018

Предположим, что у меня есть два связанных между собой объекта 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 существует. Если не существует, не выполняйте дополнительный запрос. Как я могу это сделать?

1 Ответ

0 голосов
/ 02 июля 2018

Укажите граф сущности в методе хранилища и введите EntityGraphType.LOAD:

@Repository
public interface ARepository extends CrudRepository<A, Integer> {

  @EntityGraph(value = "subGraph", type = EntityGraphType.LOAD)
  List<A> streamAll();

}
...