Sobes.tech
Junior — Middle
103

Jakými přístupy jste odstranili problém vícenásobných dotazů (N+1) v Hibernate a jak jste to realizovali?

Společnosti byly požádány
Stroki

Odpověď od AI

sobes.tech AI

Problém N+1 v Hibernate nastává, když při načítání kolekce entit pro každou z nich je provedena samostatná dotaz do databáze, což výrazně snižuje výkon.

Hlavní přístupy k řešení tohoto problému:

  1. Použití JOIN FETCH v JPQL/HQL — umožňuje načíst související entity v jednom dotazu pomocí join.
String hql = "SELECT p FROM Parent p JOIN FETCH p.children";
List<Parent> parents = session.createQuery(hql, Parent.class).getResultList();
  1. Entity Graphs — deklarativní způsob, jak určit, které vazby mají být načteny ihned.

  2. FetchType.EAGER — eager načítání, ale je třeba používat opatrně, aby se nenahrávaly zbytečné data vždy.

  3. Batch fetching — konfigurace Hibernate pro načítání souvisejících entit v dávkách, čímž se snižuje počet dotazů.

  4. Použití @Fetch(FetchMode.SUBSELECT) — Hibernate načítá kolekce jedním dodatečným dotazem s poddotazem.

Volba přístupu závisí na konkrétní situaci a požadavcích na výkon.