2017-08-10 55 views
0

我有下面寫在HQL命名查詢:休眠聯同條件獲取的右側聯接

query = "select u from User u " + 
    "join fetch u.devices d " + 
    "join fetch u.ipRestrictions ir " + 
    "join fetch u.employees e where " + 
    "u.login = :login and " + 
    "u.enumDataState.id = :dataStateId and " + 
    "d.enumDataState.id = :dataStateId and " + 
    "ir.enumDataState.id = :dataStateId and " + 
    "e.enumDataState.id = :dataStateId ") 

當我執行它,我通過電子郵件和dataStateId值。我可以在數據庫表中看到,有一個具有給定電子郵件和dataStateId的用戶,但我沒有得到任何結果。

查詢的目的是爲join fetch激活的用戶(dataStateId告訴用戶是否激活)與給定的電子郵件與設備,ipRestrictions和僱員也是活躍的。

我已經看到了一些在stackoverflow上的答案,一些建議使用left join fetchleft join fetch也沒有工作。

我相信,有一個用戶具有給定的電子郵件和給定的dataStateId,因爲我可以在數據庫數據編輯器中看到他。

我該如何解決這個問題?這是一個巨大的問題,因爲我會有很多這樣的功能,我需要使用一些條件檢查join fetch的右側。

我正在使用Hibernate v5.2。

+1

查詢指定你正在尋找一個用戶登錄「與用戶狀態/設備狀態/ iprestriction狀態/員工狀態全部同時處於與您相同的狀態。你確定你的數據集有這樣的用戶? (您只能說出用戶和用戶狀態,而不是其他信息。) – wargre

+0

查詢必須返回電子郵件和狀態匹配的用戶,以及狀態也處於活動狀態的其他對象(可選)。因此,如果有匹配的用戶,但它沒有任何匹配的設備,我希望無論如何都能獲取用戶,但只有空設備列表。我正在使用連接提取來避免1 + n查詢問題。 –

回答

1

從您的意見,您應該使用:

select u from User u 
    left join fetch u.devices d 
    left join fetch u.ipRestrictions ir 
    left join fetch u.employees e 
where 
    u.login = :login and u.enumDataState.id = :dataStateId and 
    (d is null or d.enumDataState.id = :dataStateId) and 
    (ir is null or ir.enumDataState.id = :dataStateId) and 
    (e is null or e.enumDataState.id = :dataStateId) 

注:is null可能無法正常工作(取決於JPA版本和實現)。 您可能需要使用

  • u.devices是空
  • u.devices是空
+0

非常感謝,它拯救了我的夜晚! –