Проблема N+1 — одна из самых распространённых ошибок при работе с ORM, особенно с Hibernate. Она приводит к чрезмерному количеству SQL-запросов к базе данных и, как следствие, к ухудшению производительности. 💡 N+1 означает:1 запрос загружает список сущностей (например, List<Order>),
N запросов (по одному на каждую сущность) загружают связанные данные (например, order.getItems()).
Это особенно критично при большом количестве сущностей (N = 1000 → 1001 запросов!). Рассмотрим простую доменную модель: Теперь представим, что мы хотим вывести все заказы и для каждого — список товаров: ❗ При fetch = FetchType.LAZY (по умолчанию для @OneToMany) связанные сущности подгружаются лениво, то есть только при обращении.
И именно это вызывает N дополнительных запросов — по одному на каждый order.getItems(). Загружаем заказы вместе с товарами одним запросом: DISTINCT нужен, чтобы избежать дублирования заказов при JOIN (если у заказа несколько товаров). Теперь SQL будет примерно таким: JPA предлагает