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
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.