Мне нужно получить связанные записи данных, используя 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;
}
Заранее спасибо.