Встречается на 2% собеседований по Java

Как решал проблему N+1 в Hibernate

Проблема N+1 возникает, когда Hibernate делает один запрос для получения сущностей и N запросов для связанных коллекций. Решения:

  1. JOIN FETCH в JPQL/HQL:
java
List<Order> orders = em.createQuery(
    "SELECT o FROM Order o JOIN FETCH o.items WHERE o.id = :id", 
    Order.class)
    .setParameter("id", orderId)
    .getResultList();
  1. @BatchSize - загружает связанные сущности пачками:
java
@Entity
public class Order {
    @BatchSize(size = 10)
    @OneToMany(mappedBy = "order")
    private List<Item> items;
}
  1. @Fetch(FetchMode.SUBSELECT):
java
@OneToMany(mappedBy = "order")
@Fetch(FetchMode.SUBSELECT)
private List<Item> items;
  1. EntityGraph (JPA 2.1+):
java
EntityGraph<Order> graph = em.createEntityGraph(Order.class);
graph.addAttributeNodes("items");

Map<String, Object> hints = new HashMap<>();
hints.put("javax.persistence.loadgraph", graph);

Order order = em.find(Order.class, orderId, hints);

Выбор зависит от контекста: JOIN FETCH хорош для разовых запросов, BatchSize и Subselect - для частых обращений к коллекциям.

Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы