sql >> Databáze >  >> RDS >> PostgreSQL

Dědičnost JPA @EntityGraph zahrnuje volitelná přidružení podtříd

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



  1. Jak funguje funkce WEIGHT_STRING() v MySQL

  2. Přístup odepřen pro uživatele 'username'@'localhost' (pomocí hesla:ANO) v C:\webdev\wamp\www\membershipSite\classes\Mysql.php na řádku 9

  3. Jak přidám další členy do svého sloupce typu ENUM v MySQL?

  4. Jak nainstalovat MySQL Workbench na Ubuntu