JUNTE-SE
Ao usar JOIN
contra associações de uma entidade, o JPA gerará uma JOIN entre as tabelas da entidade pai e da entidade filha na instrução SQL gerada.
Então, tomando o seu exemplo, ao executar esta consulta JPQL:
FROM Employee emp
JOIN emp.department dep
O Hibernate irá gerar a seguinte instrução SQL:
SELECT emp.*
FROM employee emp
JOIN department dep ON emp.department_id = dep.id
Observe que a SELECT
cláusula SQL contém apenas as employee
colunas da tabela, e não department
as. Para buscar as department
colunas da tabela, precisamos usar em JOIN FETCH
vez de JOIN
.
JUNTE-SE À PESQUISA
Portanto, em comparação com JOIN
, o JOIN FETCH
permite projetar as colunas da tabela de junção na SELECT
cláusula da instrução SQL gerada.
Portanto, no seu exemplo, ao executar esta consulta JPQL:
FROM Employee emp
JOIN FETCH emp.department dep
O Hibernate irá gerar a seguinte instrução SQL:
SELECT emp.*, dept.*
FROM employee emp
JOIN department dep ON emp.department_id = dep.id
Observe que, desta vez, as department
colunas da tabela também são selecionadas, não apenas as associadas à entidade listada na FROM
cláusula JPQL.
Além disso, JOIN FETCH
é uma ótima maneira de abordar a questão LazyInitializationException
ao usar o Hibernate, pois você pode inicializar associações de entidades usando a FetchType.LAZY
estratégia de busca junto com a entidade principal que você está buscando.