Spring Data JPA左连接并使用where子句

3

我在我的代码库中有以下查询:

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

solution - buræquete
2个回答

5

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

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

因此,您需要进行两次连接。第一次使用普通JOIN连接,以识别正确的Projet记录,然后第二次使用FETCH JOIN连接来获取相应的Users:

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

谢谢mateuszlo。已经尝试过了,但出现了以下异常:嵌套异常为java.lang.IllegalArgumentException: Count查询验证失败于方法public abstract org.springframework.data.domain.Page com.example.app.repository.ProjectRepository.findAllByUserLogin(java.lang.String,org.springframework.data.domain.Pageable)! org.hibernate.QueryException: 查询指定了联接获取,但是在选择列表中没有提供所获取关联的所有者。 - Rick GZ

0
首先,我假设您正在使用分页功能?这意味着您的 JPA 查询方法中有一个可分页的参数?如果是这样,有两种解决方法。

计数查询

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接