Java Spring数据jpa左连接fetch和where子句

Java Spring数据jpa左连接fetch和where子句,java,spring,jpa,spring-data-jpa,Java,Spring,Jpa,Spring Data Jpa,我的存储库中有以下查询: SELECT p FROM Project p JOIN p.users u WHERE u.login =:login 用户和项目之间存在多对多关系。 一切正常,它返回用户的项目,但我希望每个项目都返回相应的用户集 更新:按照mateuszlo的建议尝试了以下操作: SELECT p FROM Project p JOIN FECTH p.users JOIN p.users u WHERE u.login =:login 但现在我得到了以下例外: nested

我的存储库中有以下查询:

SELECT p FROM Project p JOIN p.users u WHERE u.login =:login
用户和项目之间存在多对多关系。 一切正常,它返回用户的项目,但我希望每个项目都返回相应的用户集

更新:按照mateuszlo的建议尝试了以下操作:

SELECT p FROM Project p JOIN FECTH p.users JOIN p.users u WHERE u.login =:login
但现在我得到了以下例外:

nested exception is java.lang.IllegalArgumentException: Count query validation failed for method public abstract org.springframework.data.domain.Page com.example.app.repository.ProjectRepository.findAllByUserLo‌​gin(java.lang.String‌​,org.springframework‌​.data.domain.Pageabl‌​e)! org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list

无法为FETCH JOIN查询创建命名别名,以便在
WHERE
语句中使用它。JPA不允许故意这样做,因为这很容易导致不必要的情况

考虑一个
项目
X,它有3个
用户
:John、Tom和Mike。使用FETCH JOIN查询具有用户John的项目将返回只有一个用户John的
Project
X。这将产生一个不完整的
项目
实体,该实体与当前数据库状态不一致

所以你要做的就是加入两次。第一次使用正常的
JOIN
,以识别正确的
Projet
记录,然后第二次使用
FETCH JOIN
以获取相应的
用户

SELECT p FROM Project p 
JOIN FETCH p.users
JOIN p.users u WHERE u.login =:login

首先,我假设你在使用分页?也就是说,在JPA查询方法上有一个可分页的参数?如果是这样,有两种方法可以解决这个问题

计数查询
@Query(value=“从项目p中选择p”+
“LEFT JOIN FETCH p.u其中u.login:=login”,
countQuery=“从用户u中选择计数(u),其中u.login:=login”)
PageFetchProjectsBySerLogin(字符串登录,可分页);
实体图
@Query(value=“从项目p中选择p”+
“左加入p.u用户,其中u.login:=登录”)
@EntityGraph(AttributePath={“users”},type=EntityGraph.EntityGraphType.FETCH)
PageFetchProjectsBySerLogin(字符串登录,可分页);

谢谢mateuszlo。已经尝试过,但得到以下异常:嵌套异常为java.lang.IllegalArgumentException:方法public abstract org.springframework.data.domain.Page com.example.app.repository.ProjectRepository.findAllByUserLogin(java.lang.String,org.springframework.data.domain.Pageable)的计数查询验证失败!org.hibernate.QueryException:查询指定了联接获取,但获取的关联的所有者不在选择列表中
@Query(value = "SELECT p FROM Project p " +
       "LEFT JOIN FETCH p.users u WHERE u.login :=login",
countQuery = "SELECT COUNT(u) FROM User u WHERE u.login :=login")
Page<Project> fetchProjectsByUserLogin(String login, Pageable pageable);
@Query(value = "SELECT p FROM Project p " +
       "LEFT JOIN p.users u WHERE u.login :=login")
@EntityGraph(attributePaths = {"users"}, type = EntityGraph.EntityGraphType.FETCH)
Page<Project> fetchProjectsByUserLogin(String login, Pageable pageable);