Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPQL,有没有一种方法可以过滤子集合,而不同时过滤不满足条件的父集合?_Java_Hibernate_Jpql - Fatal编程技术网

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中删除重复项,但似乎效率不高。