sql >> Database teknologi >  >> RDS >> PostgreSQL

JPA-arv @EntityGraph inkluderer valgfri tilknytninger af underklasser

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.



  1. Flyt tabel fra en database til en anden i MySQL

  2. Tæl forekomst af værdier i en serialiseret attribut (array) i Active Admin dashboard (Rails, Active admin 1.0, Postgresql database, postgres_ext gem)

  3. Hvordan får man optælling af personer baseret på aldersgrupper ved hjælp af SQL-forespørgsel i Oracle-databasen?

  4. MySQL-databaseimplementeringsautomatisering