Ric*_* GZ 3 java spring jpa spring-data-jpa
我的存储库中有以下查询:
\n\nSELECT p FROM Project p JOIN p.users u WHERE u.login =:login\nRun Code Online (Sandbox Code Playgroud)\n\n用户和项目之间存在多对多关系。\n一切正常,它返回用户的项目,但我希望每个项目返回相应的用户集。
\n\n更新:按照 mateuszlo 的建议尝试了以下操作:
\n\nSELECT p FROM Project p JOIN FECTH p.users JOIN p.users u WHERE u.login =:login\nRun Code Online (Sandbox Code Playgroud)\n\n但现在我遇到了以下异常:
\n\nnested exception is java.lang.IllegalArgumentException: Count query validation failed for method public abstract org.springframework.data.domain.Page com.example.app.repository.ProjectRepository.findAllByUserLo\xe2\x80\x8c\xe2\x80\x8bgin(java.lang.String\xe2\x80\x8c\xe2\x80\x8b,org.springframework\xe2\x80\x8c\xe2\x80\x8b.data.domain.Pageabl\xe2\x80\x8c\xe2\x80\x8be)! org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list\nRun Code Online (Sandbox Code Playgroud)\n
不可能为 FETCH JOIN 查询创建命名别名以在WHERE语句中使用它。JPA 故意不允许这样做,因为它很容易导致不必要的情况。
考虑一个ProjectX,其中有 3 个Users:约翰、汤姆和迈克。使用 FETCH JOIN 查询具有用户 John 的项目将返回ProjectX,其中只有一个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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14415 次 |
| 最近记录: |