我目前正在使用 JPA 和 queryDSL 進行 Web 專案。
據我所知,fetch join 用于減少執行延遲加載時發送到 DBMS 的 SQL 數量。(因為 fetch 加入的物體包含在持久化背景關系中)
如果是這樣,是否應該使用 fetch join 呼叫所有延遲加載到服務層的物體?
例如,一個有聊天系統的發帖社區......
聊天室表。
ChatRoom (Long id, Member memberFrom, Member memberTo, Post post)
// post is where the chat starts from. The members can start a chat from the post.
請求聊天室串列的API只需要加入memberFrom和memberTo的物體即可。所以從功能方面來看,下面的查詢滿足條件。
return query.select(chat)
.from(chat)
.innerJoin(chat.memberFrom, member).fetchJoin()
.innerJoin(chat.memberTo, member).fetchJoin()
.where(chat.memberFrom.email.eq(email).or(
chat.memberTo.email.eq(email)))
.fetch();
但是將回傳的 DTO 也需要 post 和 message 物體,因此它們將被延遲加載到服務層。在這種情況下,我還應該像下面一樣獲取加入訊息和發布物體嗎?
return query.select(chat)
.from(chat)
.innerJoin(chat.memberFrom, member).fetchJoin()
.innerJoin(chat.memberTo, member).fetchJoin()
.innerJoin(chat.messages, message1).fetchJoin()
.innerJoin(chat.post, post).fetchJoin()
.where(chat.memberFrom.email.eq(email).or(
chat.memberTo.email.eq(email)))
.fetch();
uj5u.com熱心網友回復:
這完全取決于是否實際讀取/使用了加入的關聯。如果它們未使用,則可以將它們保留為未初始化狀態,并且它們不會導致執行任何額外的 SQL 陳述句。相反,Hibernate 將代理這些欄位。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318576.html
