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í.