【发布时间】:2021-11-27 05:34:13
【问题描述】:
我目前正在使用 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();
【问题讨论】: