我们正在更新一个从Querydsl版本3到版本4的项目,子查询的工作方式发生了变化。在第3版中,可以编写如下所示的子查询:
ListSubQuery<Long> subQueryResult = new JPASubQuery()
.from(domain)
.where(domain.prefix.eq(prefix))
.list(domain.id);我将代码升级为:
JPQLQuery<Long> subQueryResult = from(domain)
.select(domain.id)
.where(domain.prefix.eq(prefix))
.fetchAll();我的问题是关于我在查询结束时添加的方法fetchAll。我不确定是否有必要。我以为它是list的替代品,但我的同事指出返回类型只是JPQLQuery,它已经由where返回。
JavaDoc for fetchAll声明:
将"fetchJoin all properties“标志添加到最后定义的联接中。
对我来说没什么意义。实验似乎表明,这个呼吁是不必要的,但这仍然是一个问题--它是做什么用的?我能安全地从我的子查询中删除它吗?
发布于 2019-10-21 15:23:49
您需要一个fetchJoin()来实际加载标记为“懒惰”的属性。这对您的示例(只加载一个domain.id值)没有多大意义,但是如果您开始在子查询中加载复杂的数据类型,您可能实际上希望您的数据出现在根查询中。
尽管如此,如果有一个具有“很多”惰性属性的复杂数据类型,您可能不希望/需要将fetch标志添加到所有这些属性中,而只需要添加到查询实际需要的那些属性中。因此,仅仅调用fetchAll可能并不是您一直需要的。当有疑问时,我建议启用sql并分析生成的sql,每个JOIN FETCH都是一个迫切的负载。
,我能安全地从子查询中删除它吗?
因此TL;DR:如果您过去从未考虑过JOIN FETCH,那么实际上:是的,您应该能够安全地忽略fetchAll,因为它不会给您的查询添加任何新的内容。这应该是一种方便的方法,可以省去一些样板代码,以防您真的想要满负荷的数据。
https://stackoverflow.com/questions/58488984
复制相似问题