java 16 lines · 5 steps

Killing N+1 queries with @EntityGraph in Spring

How Spring Data JPA repository methods eagerly fetch related entities in a single query using entity graphs.

Explained by highlit
1@Repository
2public interface OrderRepository extends JpaRepository<Order, Long> {
3 
4 @EntityGraph(attributePaths = {"customer", "lineItems", "lineItems.product"})
5 @Query("select o from Order o where o.status = :status")
6 List<Order> findByStatusWithDetails(@Param("status") OrderStatus status);
7 
8 @EntityGraph(attributePaths = {"customer", "lineItems"})
9 Optional<Order> findWithDetailsById(Long id);
10 
11 @EntityGraph(attributePaths = {"lineItems", "lineItems.product"})
12 Page<Order> findByCustomerId(Long customerId, Pageable pageable);
13 
14 @EntityGraph(value = "Order.withShipments", type = EntityGraph.EntityGraphType.LOAD)
15 List<Order> findByPlacedAtBetween(Instant from, Instant to);
16}
01 / 01
STEP 01

Walkthrough

Space play step click any line
Three takeaways
  1. 1@EntityGraph declares which associations to fetch eagerly per query, sidestepping the N+1 problem without changing entity mappings.
  2. 2attributePaths accepts dotted paths like lineItems.product to fetch nested associations several levels deep.
  3. 3Named entity graphs and LOAD versus FETCH types let you reuse and fine-tune eager-loading strategy across methods.

Related explainers

Share this explainer

Here's the card — post it anywhere.

Killing N+1 queries with @EntityGraph in Spring — share card
Made with highlit — turn any snippet into a walkthrough like this in about a minute.
Explain your code