sql >> Databasteknik >  >> RDS >> PostgreSQL

JPA-arv @EntityGraph inkluderar valfria associationer av underklasser

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.



  1. PostgreSQL - Tom tabell

  2. är det snabbare att infoga rader i primärnyckelordning?

  3. Spara array i databasen eller skapa olika kolumner

  4. Förstå körningsplan för operatörstider