hibernate jpa EntityGraph не выбирает запросы SELECT с отношениями глубже двух уровней - PullRequest
0 голосов
/ 05 ноября 2019

Мне нужно получить связанные записи данных, используя SINGLE Запрос SELECT для mariadb, используя spring Data + Hibernate 5.

Чтобы избежать проблемы N+1 selects, я успешно реализовал JPA EntityGraph (программно).

Но похоже, что выборка работает нормально только до 2 уровней отношений. (то есть родитель для <-> непосредственного потомка).

Принимая во внимание то, что таблица Identity Main соответствует типу -> A->B->C, я поэкспериментировал с функцией Subgraph EntityGraphs и сумел установить график выборки как A->B-> C.

Код ниже:

@Bean
public EntityGraph<Identity> geteg() {
    EntityGraph<Identity> entityGraph = entityManager.createEntityGraph(Identity.class);
    entityGraph.addAttributeNodes("a");
    Subgraph<A> aSubGraph = entityGraph.addSubgraph("a");
    aSubGraph.addAttributeNodes("b");
    aSubGraph.addSubgraph("b").addAttributeNodes("c");
    entityGraph.addSubgraph("a").addAttributeNodes("b");    
    return entityGraph;
}

Но Hibernate по-прежнему выбирает до уровня 2, а затем в Таблице C запускается множество отдельных запросов SELECT.

ниже приведены мои сущности, может кто-нибудь подсказать, как использовать EntityGraph для уровня 3+ SELECT .

@Entity
@Table(name = "IDENTITY")
public class Identity implements java.io.Serializable {

    private Set<A> a;
}

@Entity
@Table(name = "A")
public class A implements java.io.Serializable {

    private AId id;
    private B b;
}

@Entity
@Table(name = "B")
public class B implements java.io.Serializable {

    private BId id;
    private String code;
    private C c;
}

@Entity
@Table(name = "C")
public class C implements java.io.Serializable {

    @Id
    private String code;
    private String name;
}

Заранее спасибо.

...