【问题标题】:Querydsl JPQLQuery fetchAll purposeQuerydsl JPQLQuery fetchAll 用途
【发布时间】:2019-10-21 14:58:02
【问题描述】:

我们正在将项目从 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 返回。

fetchAll

JavaDoc 状态:

将“fetchJoin all properties”标志添加到最后定义的连接。

这对我来说毫无意义。实验似乎表明调用是不必要的,但这仍然留下了一个问题——它是为了什么?我可以从我的子查询中安全地删除它吗?

【问题讨论】:

    标签: java querydsl


    【解决方案1】:

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

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

    我可以安全地从我的子查询中删除它吗

    所以 TL;DR:如果您过去从未考虑过 JOIN FETCH,那么实际上:是的,您应该能够安全地忽略 fetchAll,因为它不会为您的查询添加任何新内容.它应该只是一种方便的方式,可以为您节省一些样板代码,以防您真正想要完全急切地加载数据。

    【讨论】:

      猜你喜欢
      • 2017-04-14
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2013-09-22
      • 2013-08-20
      • 1970-01-01
      相关资源
      最近更新 更多