Du kan kun bruge en EntityGraph
hvis associationsattributten er en del af superklassen og dermed også en del af alle underklasser. Ellers EntityGraph vil altid mislykkes med Exception som du i øjeblikket får.
Den bedste måde at undgå dit N+1-valgsproblem på er at opdele din forespørgsel i 2 forespørgsler:
Den 1. forespørgsel henter MCValue enheder ved hjælp af en EntityGraph for at hente tilknytningen kortlagt af den selected attribut. Efter den forespørgsel gemmes disse entiteter i Hibernates cache på 1. niveau / persistenskonteksten. Hibernate vil bruge dem, når det behandler resultatet af den 2. forespørgsel.
@Query("SELECT m FROM MCValue m") // add WHERE clause as needed ...
@EntityGraph(attributePaths = {"selected"})
public List<MCValue> findAll();
Den 2. forespørgsel henter derefter Answer enhed og bruger en EntityGraph for også at hente den tilknyttede Value enheder. For hver Value enhed, vil Hibernate instansiere den specifikke underklasse og kontrollere, om cachen på 1. niveau allerede indeholder et objekt for denne klasse og primær nøglekombination. Hvis det er tilfældet, bruger Hibernate objektet fra cachen på 1. niveau i stedet for de data, der returneres af forespørgslen.
@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();
Fordi vi allerede har hentet alle MCValue enheder med den tilhørende selected enheder, får vi nu Answer enheder med en initialiseret value forening. Og hvis tilknytningen indeholder en MCValue enhed, dens selected tilknytning vil også blive initialiseret.