Du kan bara använda en EntityGraph
om associationsattributet är en del av superklassen och därmed också en del av alla underklasser. Annars, EntityGraph
kommer alltid att misslyckas med Exception
som du för närvarande får.
Det bästa sättet att undvika ditt N+1-valproblem är att dela upp din fråga i två frågor:
Den första frågan hämtar MCValue
enheter som använder en EntityGraph
för att hämta associationen som mappas av den selected
attribut. Efter den frågan lagras dessa enheter sedan i Hibernates 1:a nivås cache / persistenskontexten. Hibernate kommer att använda dem när det bearbetar resultatet av den andra frågan.
@Query("SELECT m FROM MCValue m") // add WHERE clause as needed ...
@EntityGraph(attributePaths = {"selected"})
public List<MCValue> findAll();
Den andra frågan hämtar sedan Answer
entitet och använder en EntityGraph
för att även hämta det associerade Value
enheter. För varje Value
entitet, kommer Hibernate att instansiera den specifika underklassen och kontrollera om cachen på första nivån redan innehåller ett objekt för den klassen och den primära nyckelkombinationen. Om så är fallet använder Hibernate objektet från 1:a nivås cache istället för data som returneras av frågan.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Eftersom vi redan har hämtat alla MCValue
enheter med tillhörande selected
enheter får vi nu Answer
enheter med ett initierat value
förening. Och om kopplingen innehåller ett MCValue
enhet, dess selected
association kommer också att initieras.