UNIRSE
Cuando se utiliza JOINcontra las asociaciones de una entidad, JPA generará una UNIÓN entre la entidad principal y las tablas de la entidad secundaria en la instrucción SQL generada.
Entonces, tomando su ejemplo, al ejecutar esta consulta JPQL:
FROM Employee emp
JOIN emp.department dep
Hibernate va a generar la siguiente instrucción SQL:
SELECT emp.*
FROM employee emp
JOIN department dep ON emp.department_id = dep.id
Tenga en cuenta que la SELECTcláusula SQL contiene solo las employeecolumnas de la tabla, y no departmentlas. Para buscar las departmentcolumnas de la tabla, necesitamos usar en JOIN FETCHlugar de JOIN.
ÚNETE A FETCH
Entonces, en comparación con JOIN, le JOIN FETCHpermite proyectar las columnas de la tabla de unión en la SELECTcláusula de la instrucción SQL generada.
Entonces, en su ejemplo, al ejecutar esta consulta JPQL:
FROM Employee emp
JOIN FETCH emp.department dep
Hibernate va a generar la siguiente instrucción SQL:
SELECT emp.*, dept.*
FROM employee emp
JOIN department dep ON emp.department_id = dep.id
Tenga en cuenta que, esta vez, las departmentcolumnas de la tabla también se seleccionan, no solo las asociadas con la entidad enumerada en la FROMcláusula JPQL.
Además, JOIN FETCHes una excelente manera de abordar el problema LazyInitializationExceptional utilizar Hibernate, ya que puede inicializar asociaciones de entidades utilizando la FetchType.LAZYestrategia de recuperación junto con la entidad principal que está recuperando.