首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPQLQuery fetchAll目的

JPQLQuery fetchAll目的
EN

Stack Overflow用户
提问于 2019-10-21 14:58:02
回答 1查看 1.5K关注 0票数 0

我们正在更新一个从Querydsl版本3到版本4的项目,子查询的工作方式发生了变化。在第3版中,可以编写如下所示的子查询:

代码语言:javascript
复制
ListSubQuery<Long> subQueryResult = new JPASubQuery()
    .from(domain)
    .where(domain.prefix.eq(prefix))
    .list(domain.id);

我将代码升级为:

代码语言:javascript
复制
JPQLQuery<Long> subQueryResult = from(domain)
    .select(domain.id)
    .where(domain.prefix.eq(prefix))
    .fetchAll();

我的问题是关于我在查询结束时添加的方法fetchAll。我不确定是否有必要。我以为它是list的替代品,但我的同事指出返回类型只是JPQLQuery,它已经由where返回。

JavaDoc for fetchAll声明:

将"fetchJoin all properties“标志添加到最后定义的联接中。

对我来说没什么意义。实验似乎表明,这个呼吁是不必要的,但这仍然是一个问题--它是做什么用的?我能安全地从我的子查询中删除它吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-21 15:23:49

您需要一个fetchJoin()来实际加载标记为“懒惰”的属性。这对您的示例(只加载一个domain.id值)没有多大意义,但是如果您开始在子查询中加载复杂的数据类型,您可能实际上希望您的数据出现在根查询中。

尽管如此,如果有一个具有“很多”惰性属性的复杂数据类型,您可能不希望/需要将fetch标志添加到所有这些属性中,而只需要添加到查询实际需要的那些属性中。因此,仅仅调用fetchAll可能并不是您一直需要的。当有疑问时,我建议启用sql并分析生成的sql,每个JOIN FETCH都是一个迫切的负载。

,我能安全地从子查询中删除它吗?

因此TL;DR:如果您过去从未考虑过JOIN FETCH,那么实际上:是的,您应该能够安全地忽略fetchAll,因为它不会给您的查询添加任何新的内容。这应该是一种方便的方法,可以省去一些样板代码,以防您真的想要满负荷的数据。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58488984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档