我应该获取加入所有延迟加载的实体吗?
Should I fetch join all the entities that are lazily loaded?
我目前正在使用 JPA 和 queryDSL 开发 Web 项目。
据我所知,fetch join是用来减少执行延迟加载时发送给DBMS的SQL个数。 (因为获取连接的实体包含在持久性上下文中)
如果是这样,是否应该使用 fetch join 调用服务层中延迟加载的所有实体?
例如,具有聊天系统的 posting 社区...
聊天室table.
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 和消息实体,因此它们将延迟加载到服务层中。在这种情况下,我是否还应该像下面那样获取加入消息和 post 实体?
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();
这完全取决于加入的关联是否实际被读取/使用。如果它们未被使用,那么将它们保留为未初始化就可以了,它们不会导致执行任何额外的 SQL 语句。相反,Hibernate 将代理这些字段。
我目前正在使用 JPA 和 queryDSL 开发 Web 项目。
据我所知,fetch join是用来减少执行延迟加载时发送给DBMS的SQL个数。 (因为获取连接的实体包含在持久性上下文中)
如果是这样,是否应该使用 fetch join 调用服务层中延迟加载的所有实体?
例如,具有聊天系统的 posting 社区...
聊天室table.
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 和消息实体,因此它们将延迟加载到服务层中。在这种情况下,我是否还应该像下面那样获取加入消息和 post 实体?
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();
这完全取决于加入的关联是否实际被读取/使用。如果它们未被使用,那么将它们保留为未初始化就可以了,它们不会导致执行任何额外的 SQL 语句。相反,Hibernate 将代理这些字段。