0 Tage Serie
java / expert
Snippet

Dynamische Abfragestrategien mit JPA EntityGraph

EntityGraphs bieten eine Möglichkeit, Fetch-Pläne zur Laufzeit zu überschreiben und das N+1-Selektproblem zu lösen, ohne 'EAGER'-Fetch-Typen fest in Entitäten zu kodieren. Mithilfe von Subgraphs können Sie präzise definieren, welche verschachtelten Assoziationen basierend auf dem spezifischen Anwendungsfall in einer einzigen JOIN-Abfrage geladen werden sollen.

snippet.java
java
1
2
3
4
5
6
7
8
9
public List<Order> findOrdersWithDetails(Long customerId) {
EntityGraph<Order> graph = em.createEntityGraph(Order.class);
graph.addSubgraph("items").addAttributeNodes("product");
return em.createQuery("SELECT o FROM Order o WHERE o.customer.id = :id", Order.class)
.setParameter("id", customerId)
.setHint("jakarta.persistence.loadgraph", graph)
.getResultList();
}
spring
Erklärung
1
EntityGraph<Order> graph = em.createEntityGraph(Order.class);
Erstellt einen veränderbaren Root-Graph für die Order-Entität.
2
graph.addSubgraph("items").addAttributeNodes("product");
Definiert einen tiefen Fetch-Pfad für verschachtelte Assoziationen innerhalb der Bestellpositionen.
3
.setHint("jakarta.persistence.loadgraph", graph)
Weist den JPA-Provider an, angegebene Attribute als EAGER und andere als LAZY zu behandeln.