N+1 problem: load list entity (1 query), rồi mỗi entity gọi thêm 1 query lấy association → 1 + N query thay vì 1.
java
List<Order> orders = orderRepo.findAll(); // Query 1
for (Order o : orders) o.getCustomer().getName(); // Query 2..N+1 → 100 order = 101 queryPhát hiện: spring.jpa.show-sql=true → thấy query lặp.
Fix:
java
// 1. JOIN FETCH
@Query("SELECT o FROM Order o JOIN FETCH o.customer WHERE o.status = :s")
List<Order> findByStatus(@Param("s") String s);
// 2. @EntityGraph
@EntityGraph(attributePaths = {"customer", "items"})
List<Order> findByStatus(String status);
// 3. DTO projection (tốt nhất cho read-only): interface có getId/getStatus/getCustomerNameLưu ý: N nhỏ (<5) và query đơn giản có thể không cần fix; profile trước khi optimize.