A Project
имеет список сотрудников. Employee
имеет набор projectEmployeeRole. ProjectEmployeeRole
подключен к одному проекту.
Я хотел получить проект со всеми его сотрудниками и ProjectEmployeeRoles сотрудников в одном запросе, чтобы избежать проблемы N + 1.
Я могу сделать это с:
@Query("SELECT project FROM Project project JOIN FETCH project.employees employees " +
"LEFT JOIN FETCH employees.projectEmployeeRoles role " +
"WHERE project.id = :id")
Project findProjectById(@Param("id") long id);
Но я хотел бы получить только роли, идентификатор проекта которых равен идентификатору проекта параметров. Я попытался сделать:
@Query("SELECT project FROM Project project JOIN FETCH project.employees employees " +
"LEFT JOIN FETCH employees.projectEmployeeRoles role " +
"WHERE project.id = :id AND role.project.id = :id")
Project findProjectById(@Param("id") long id);
Это правильно вернуло только те роли, у которых ID проекта равен параметру, но проблема в том, что он не вернул сотрудников, у которых нет ролей, которые выполняют это условие. Я бы хотел, чтобы все-таки вернули всех сотрудников проекта. Только роли сотрудников должны быть отфильтрованы. Таким образом, сотрудники, у которых нет ролей, соответствующих условию, должны по-прежнему возвращаться с пустым набором ролей.
Есть ли способ сделать это?