Ради простоты, рассмотрите следующие объекты и предположим, что они правильно объявлены как < /p>
Вот мои сущности < /p>
class EntityA {
private String id;
@OneToMany
List entityBList;
@OneToMany
List entityCList;
}
class EntityB {
private String idB;
@ManyToOne
EntityA entityA;
}
class EntityC {
private String idC;
@OneToMany
List entityDList;
@ManyToOne
EntityA entityA;
}
class EntityD {
private String idD;
@ManyToOne
private EntityC entityC;
}
Обратите внимание на то, что выше имеется вложенные коллекции
Предположим, что я хочу получить 1000 Entitya (в комплекте со всеми коллекциями и коллекциями ее детей, и я хотел, чтобы они уже были загружены, когда я делаю, скажем, репо. будет < /p>
EntityA будет иметь список как EntityB , так и Entityc , но я также хотел, чтобы список EntityD уже загружен в EntityC
в основном выполнение только некоторых запросов в создании результатов (включая коллекции и вложенные сборы) в начале, и когда они будут выполнены, которые не будут выполнены, что не будет выполнено. Db
Вот что я знаю в настоящее время,
смог сделать EntityGraph Однако я не могу загрузить вложенную коллекцию Entityd в Entityc , все еще приведен в n+1, Subgry -subgry -subgre, что -то вроде Определение ниже, называемое их в 2 отдельный репозитный вызов.@NamedEntityGraph(
name = "EntityAPlusEntityB",
attributeNodes = {
@NamedAttributeNode("entityBList")
}
)
@NamedEntityGraph(
name = "EntityAPlusEntityC",
attributeNodes = {
@NamedAttributeNode( value = "entityCList", subgraph = "EntityCPlusEntityD")
},
subgraphs = {
@NamedSubgraph(
name = "EntityCPlusEntityD",
attributeNodes = {
@NamedAttributeNode("entityDList")
}
)
}
)
class EntityA {}
@EntityGraph(value = "EntityAPlusEntityB", type = EntityGraph.EntityGraphType.FETCH)
Optional findEntityAById_LoadEntityB(String id);
@EntityGraph(value = "EntityAPlusEntityC", type = EntityGraph.EntityGraphType.FETCH)
Optional findEntityAById_LoadEntityC(String id);
Проблема
В настоящее время я все еще не могу получить загруженный список Entityd в Entityc, всегда приведет к отдельному SQL, выполненному Hibernate, когда я делаю EntityC.GetEnityDlist (). Поскольку я ожидаю, что все загружено в начале, не должно быть выполнено другого SQL -запроса, поскольку это будет проблема N+1. Файл < /p>
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
Подробнее здесь: https://stackoverflow.com/questions/796 ... ollections