簡體   English   中英

Spring數據jpa left join fetch和where子句

[英]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.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 故意不允許這樣做,因為它很容易導致不需要的情況。

考慮一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM