[英]Spring data jpa left join fetch and where clause
我的存儲庫中有以下查詢:
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.findAllByUserLogin(java.lang.String,org.springframework.data.domain.Pageable)! 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 故意不允許這樣做,因為它很容易導致不需要的情況。
考慮一個Project
X,它有 3 個Users
:John、Tom 和 Mike。 使用 FETCH JOIN 查詢項目,具有用戶 John 將僅返回一個User
- John 的Project
X。 這將產生一個不完整的Project
實體,與當前的數據庫狀態不一致。
所以你要做的就是加入兩次。 第一次使用普通JOIN
來識別正確的Projet
記錄,然后第二次使用FETCH JOIN
來獲取對應的Users
:
SELECT p FROM Project p
JOIN FETCH p.users
JOIN p.users u WHERE u.login =:login
首先,我假設您正在使用分頁? 也就是說,您的 JPA 查詢方法上有一個 Pagable 參數? 如果是這樣,有兩種方法可以解決這個問題。
@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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.