Non penso che comprenderò mai completamente i join.Come faccio un join "deep" per il recupero in JPQL?
Ho una query in cui sto tentando di riempire avidamente i riferimenti su due livelli.
Cioè, il mio A
ha un optional Collection
di B
s, e ciascuno ha B
0 o 1 C
. La dimensione della collezione B
è nota per essere piccola (10-20 in più). Mi piacerebbe precaricare questo grafico.
A
's B
rapporto è contrassegnato come FetchType.LAZY
ed è facoltativo. La relazione di B
su C
è anche facoltativa e FetchType.LAZY
.
Speravo che potevo fare:
SELECT a
FROM A a
LEFT JOIN FETCH a.bs // look, no alias; JPQL forbids it
LEFT JOIN a.bs b // "repeated" join necessary since you can't alias fetch joins
LEFT JOIN FETCH b.c // this doesn't seem to do anything
WHERE a.id = :id
Quando eseguo questo, vedo che A
s collezione B
è davvero inverosimile (vedo un LEFT JOIN
in SQL riferimento alla tabella a cui B
è mappato) .
Tuttavia, non vedo alcuna prova che la tabella di C
venga recuperata.
Come posso precaricare tutti C
s e tutti B
s e tutti C
s che sono "raggiungibili" da un determinato A
? Non riesco a vedere alcun modo per farlo.
Quali provider JPA si usa? Ci sono suggerimenti disponibili in EclipseLink esattamente per questo tipo di funzionalità. Controlla i suggerimenti di 'eclipselink.join-fetch' e' eclipselink.batch' ... – Cascader
Grazie. Se uso 'eclipselink.join-fetch', sembra che sia permesso impostare solo un attributo. È corretto? Per esempio, se faccio saltare il mio capitale 'join-fetch' su' a.bs.c', allora se volessi unirmi a fetch-say-'a.bs.d' sarei sfortunato. Destra? –
Oh, questo è interessante. La documentazione di EclipseLink (http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Query_Hints#Join_Fetch) non dice che sono possibili chiavi duplicate per la query ma forse lo sono? Vedi questo link interessante: https://github.com/mysema/querydsl/issues/348 –