java - Spring data jpa left join fetch 和 where 子句

标签 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 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 的项目将返回 Project X,只有一个 User - John。这会产生一个不完整的 Project 实体,这与当前的数据库状态不一致。

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

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

关于java - Spring data jpa left join fetch 和 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39428551/

相关文章:

java - 在 Java 中解析二进制数据 - 大容量,单线程

java - 如何在 Hibernate 中使用 TomEE

java - "No Persistence provider for EntityManager"错误

内存泄漏

java - JTextArea和JScrollBar的交互问题

spring - JPA 中的 Java 8 日期时间 API

java - 如何使用 Spring Web Flow 绑定(bind)复合模型

java - 如何更新Spring Jpa中的对象?

java - 分配一个变量,实际发生了什么,Java

spring - 无法从数据库 ERROR 中获取 SequenceInformation 但一切正常