Můžete použít pouze EntityGraph
pokud je atribut asociace součástí nadtřídy a tím také součástí všech podtříd. Jinak EntityGraph
vždy selže s Exception
které aktuálně dostáváte.
Nejlepším způsobem, jak se vyhnout problému s výběrem N+1, je rozdělit dotaz na 2 dotazy:
První dotaz načte MCValue
entity pomocí EntityGraph
k načtení přidružení namapovaného selected
atribut. Po tomto dotazu jsou tyto entity uloženy v mezipaměti Hibernate 1. úrovně / kontextu persistence. Hibernate je použije, když zpracuje výsledek 2. dotazu.
@Query("SELECT m FROM MCValue m") // add WHERE clause as needed ...
@EntityGraph(attributePaths = {"selected"})
public List<MCValue> findAll();
2. dotaz pak načte Answer
entity a používá EntityGraph
také načíst související Value
entity. Pro každou Value
entita, Hibernate vytvoří instanci konkrétní podtřídy a zkontroluje, zda mezipaměť 1. úrovně již obsahuje objekt pro danou třídu a kombinaci primárního klíče. Pokud tomu tak je, Hibernate použije objekt z mezipaměti 1. úrovně namísto dat vrácených dotazem.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Protože jsme již načetli všechny MCValue
entity s přidruženým selected
entity, nyní dostaneme Answer
entity s inicializovanou value
sdružení. A pokud přidružení obsahuje MCValue
entita, její selected
bude také inicializováno přidružení.