UNIRSE
Cuando se utiliza JOIN
contra 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 SELECT
cláusula SQL contiene solo las employee
columnas de la tabla, y no department
las. Para buscar las department
columnas de la tabla, necesitamos usar en JOIN FETCH
lugar de JOIN
.
ÚNETE A FETCH
Entonces, en comparación con JOIN
, le JOIN FETCH
permite proyectar las columnas de la tabla de unión en la SELECT
clá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 department
columnas de la tabla también se seleccionan, no solo las asociadas con la entidad enumerada en la FROM
cláusula JPQL.
Además, JOIN FETCH
es una excelente manera de abordar el problema LazyInitializationException
al utilizar Hibernate, ya que puede inicializar asociaciones de entidades utilizando la FetchType.LAZY
estrategia de recuperación junto con la entidad principal que está recuperando.