JPQL, есть ли способ отфильтровать дочернюю коллекцию, не отсекая родительскую коллекцию, которая не выполняет условие? - PullRequest
0 голосов
/ 08 января 2020

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 проекта равен параметру, но проблема в том, что он не вернул сотрудников, у которых нет ролей, которые выполняют это условие. Я бы хотел, чтобы все-таки вернули всех сотрудников проекта. Только роли сотрудников должны быть отфильтрованы. Таким образом, сотрудники, у которых нет ролей, соответствующих условию, должны по-прежнему возвращаться с пустым набором ролей.

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 08 января 2020

Бьюсь об заклад, вы должны расширить свой запрос. Попробуйте что-то вроде этого:

@Query("SELECT project FROM Project project" + 
       "JOIN FETCH project.employees employees " +
       "JOIN FETCH employees.projectEmployeeRoles role" +
       "JOIN FETCH role.project as roleproj" +
       "WHERE project.id = :id AND roleproj.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" +
       "JOIN FETCH role.project as roleproj" +
       "WHERE project.id = :id AND roleproj.id = :id")
Project findProjectById(@Param("id") long id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...