ADERIRE
Quando si utilizza JOIN
contro associazioni di entità, JPA genererà un JOIN tra l'entità padre e le tabelle entità figlio nell'istruzione SQL generata.
Quindi, prendendo il tuo esempio, quando esegui questa query JPQL:
FROM Employee emp
JOIN emp.department dep
Hibernate genererà la seguente istruzione SQL:
SELECT emp.*
FROM employee emp
JOIN department dep ON emp.department_id = dep.id
Si noti che la SELECT
clausola SQL contiene solo le employee
colonne della tabella e non department
quelle. Per recuperare le department
colonne della tabella, è necessario utilizzare JOIN FETCH
invece di JOIN
.
UNISCITI FETCH
Pertanto, rispetto a JOIN
, JOIN FETCH
consente di proiettare le colonne della tabella di join nella SELECT
clausola dell'istruzione SQL generata.
Quindi, nel tuo esempio, quando esegui questa query JPQL:
FROM Employee emp
JOIN FETCH emp.department dep
Hibernate genererà la seguente istruzione SQL:
SELECT emp.*, dept.*
FROM employee emp
JOIN department dep ON emp.department_id = dep.id
Si noti che, questa volta, department
vengono selezionate anche le colonne della tabella, non solo quelle associate all'entità elencata nella FROM
clausola JPQL.
Inoltre, JOIN FETCH
è un ottimo modo per affrontare LazyInitializationException
quando si utilizza Hibernate in quanto è possibile inizializzare le associazioni di entità utilizzando la FetchType.LAZY
strategia di recupero insieme all'entità principale che si sta recuperando.