2017-02-27 42 views
1

我想找回在一個數據庫中的命中和所有的記錄,我使用連接抓取語句下面是我的查詢連接抓取不在Hibernate查詢語言工作

String q = "SELECT oneChat from " + Chat.class.getName() + " oneChat " 
       + " join fetch oneChat.user1 " 
       + " join fetch oneChat.user2 " 
       + " join fetch oneChat.user3 " 
       + " join fetch oneChat.groupData " 
       + "where oneChat.dmlStatus != :dmlStatusValue" 
       + " AND group_id = :groupIdValue" + " AND reference_id = 0" 
       + " AND root_chat_id = oneChat.chatId"; 

總共有4個外鍵/加入我的表中,所以我添加了聯合讀取語句,但它不工作,即不返回任何東西,如果我刪除聯合讀取語句,我會得到結果集。我的表連接默認情況下是Eager(沒有將其更改爲Lazy)。

在日誌文件中也沒有sql語法錯誤。我錯過了什麼?

更新: 這是因爲第二個加入,即user2返回null,所以我沒有得到任何數據。現在如果有人能告訴我如何解決這個問題,查詢應該是獨立的,它不應該依賴數據。

+0

你能添加那個實體嗎?當你運行一個與此hql相當的sql時,你會得到結果嗎? –

+0

是的,我得到的結果..簡單的HQL沒有這些聯接取工作正常。我得到了結果。 – developer

+0

請現在檢查更新 – developer

回答

1

,如果你想,無論返回的數據存在於依賴關係的結果,那麼你應該使用左連接,而不是內部連接(連接抓取等於內連接抓取):

"SELECT oneChat from " + Chat.class.getName() + " oneChat " 
       + " left join fetch oneChat.user1 " 
       + " left join fetch oneChat.user2 " 
       + " left join fetch oneChat.user3 " 
       + " left join fetch oneChat.groupData " 
       + "where oneChat.dmlStatus != :dmlStatusValue" 
       + " AND group_id = :groupIdValue" + " AND reference_id = 0" 
       + " AND root_chat_id = oneChat.chatId"; 

現在,當OneChat對數據庫沒有任何user2依賴性,查詢仍將返回結果,無論如何。

剛上側

..如果您使用的前綴,然後嘗試前綴添加到group_idroot_chat_id領域的WHERE子句清晰度英寸

+0

這可以影響數據,即在sql內部連接和遺漏連接是不同的嗎? – developer

+0

你會得到oneChat實體,無論它的4個依賴關係(在這種情況下可能沒有)。我明白這是你正在瞄準的目標。例如,如果您的查詢需要對只存在user2的存在透明,那麼您可以只加入該依賴關係。 –

+0

我的意思是,左連接將返回來自內部連接的所有值以及左表中與右表不匹配的所有值,包括鏈接列中具有NULL(空)值的行。 – developer