java - JPQL,有没有一种方法可以过滤子集合,而不同时过滤不满足条件的父集合?

标签 java hibernate jpql

项目有一个员工列表。一个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);

但我只想获取项目 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);

这正确地仅返回了项目 id 等于参数的角色,但问题是它没有返回不具有满足此条件的角色的员工。我希望它仍然返回该项目的所有员工。仅应过滤员工角色。因此,没有任何角色与条件匹配的员工仍应返回一组空的角色。

有办法吗?

最佳答案

我打赌你应该扩展你的查询。尝试这样的事情:

@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);

关于java - JPQL,有没有一种方法可以过滤子集合,而不同时过滤不满足条件的父集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59645141/

相关文章:

java - Hibernate 过滤器仅在从数据库加载数据后应用吗?

java - spring 不支持多个属性文件

java - 一个类中的应用程序异常作为 EJBTransactionRollbackException 返回到调用类

java - 如何在 JPQL 中创建使用隐式联接查询两个表的 TypedQuery?

java - 当我可以在 Spring JPA 中编写方法时为什么还需要 @Query

java - 如何加速 JavaFX 应用程序的 Maven 构建?

java - 删除 XWPFParagraph 会为其保留段落符号 (¶)

java - 使用扩展日历 View 显示事件信息

java - SQLite 'Database Locked' 特定查询的奇怪错误

java - java输出的解释(hibernate)