ADERIRE
Quando si utilizza JOINcontro 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 SELECTclausola SQL contiene solo le employeecolonne della tabella e non departmentquelle. Per recuperare le departmentcolonne della tabella, è necessario utilizzare JOIN FETCHinvece di JOIN.
UNISCITI FETCH
Pertanto, rispetto a JOIN, JOIN FETCHconsente di proiettare le colonne della tabella di join nella SELECTclausola 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, departmentvengono selezionate anche le colonne della tabella, non solo quelle associate all'entità elencata nella FROMclausola JPQL.
Inoltre, JOIN FETCHè un ottimo modo per affrontare LazyInitializationExceptionquando si utilizza Hibernate in quanto è possibile inizializzare le associazioni di entità utilizzando la FetchType.LAZYstrategia di recupero insieme all'entità principale che si sta recuperando.