Otimizando consultas com cláusula JOIN FETCH (forma correta)

❗Importante dizer, essa cláusula não funciona para busca paginadas do Spring.

Na classe de EmployeeRepository, criaremos um método com uma consulta personalizada

Exemplo:

public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    @Query("SELECT obj FROM Employee obj")
    List<Employee> findEmployeesWithDepartments();
}

Importante ressaltar, essa consulta na query não é SQL e sim JPQL, uma linguagem de consulta da JPA. A semântica muda, precisamos dar um "apelido" pro objeto que vamos buscar. Como colocamos acima: "obj". E no final, não precisa colocar o nome da tabela e sim da classe, conforme colocamos: Employee.

❗Importante

A JPA mantém um "cache" das entidades gerenciadas na mesma sessão JPA.

Ou seja, se você trouxer essas entidades para a memória, A JPA não volta ao banco se você precisar novamente delas (desde que seja a mesma seção JPA).

Com o código daquele jeito acima, ele buscaria alguns departamentos até achar o correto.

Para que isso não aconteça, utilizamos o JOIN FETCH, veja:

public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    @Query("SELECT obj FROM Employee obj JOIN FETCH obj.department")
    List<Employee> findEmployeesWithDepartments();
}

Consulta otimizada no console, buscando por funcionários já fazendo o Join no department:

Atualizado