Java JPQL,有没有一种方法可以过滤子集合,而不同时过滤不满足条件的父集合?
Java JPQL,有没有一种方法可以过滤子集合,而不同时过滤不满足条件的父集合?,java,hibernate,jpql,Java,Hibernate,Jpql,项目有一个员工列表。员工有一组projectEmployeeRole。ProjectEmployeeRole连接到一个项目 我想得到一个项目,在一个请求中包含所有员工和员工的projectEmployeeRoles,以避免N+1问题 我可以通过以下方式做到这一点: @Query("SELECT project FROM Project project JOIN FETCH project.employees employees " + "LEFT JOIN FETCH employ
项目
有一个员工列表。员工
有一组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);
但我只想获取项目id等于参数项目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);
这只正确地返回了projects id等于参数的角色,但问题是它没有返回没有满足此条件的角色的员工。我希望它仍然返回该项目的所有员工。只应筛选员工角色。因此,没有任何角色与条件匹配的员工仍应返回一组空角色
有办法吗?我打赌你应该扩展你的查询。试着这样做:
@Query(“从项目中选择项目”+
“加入FETCH project.employees员工”+
“加入FETCH employees.projectEmployeeRoles角色”+
“将FETCH role.project作为roleproj加入”+
“其中project.id=:id和roleproj.id=:id”)
项目findProjectById(@Param(“id”)long id);
或者这个:
@Query(“从项目中选择项目”+
“加入FETCH project.employees员工”+
“LEFT JOIN FETCH employees.projectEmployeeRoles角色”+
“将FETCH role.project作为roleproj加入”+
“其中project.id=:id和roleproj.id=:id”)
项目findProjectById(@Param(“id”)long id);
在SQL中,您只需将角色右外连接,而不是左连接,以保留没有角色的员工,但不知道这在JPQL中是否可行。你为什么不简单地加载所有员工,并在实体上使用filter方法通过项目过滤员工角色?返回Java而不是SQL中的过滤列表?@Smutje Ye,我想我可以使用发布的第一个SQL查询来获取项目及其所有员工和角色。然后过滤java中的角色。我在第一个查询中遇到的问题是,它返回了N个角色的员工N次,而不是一次。因此,项目的员工列表中有重复的员工,这是由左连接FETCH employees.projectEmployeeRoles角色引起的。它为每个角色返回一个雇员。有没有办法只选择不同的员工?我也可以在java中删除重复项,但似乎效率不高。