sql - QueryDSL 中的路径引用连接到子查询

标签 sql orm querydsl

我想知道在连接到子查询的 SQL 样式 QueryDSL 中实现此查询的最佳方法。我费了一番功夫,但还是让它生成了必要的 SQL。然而,我想知道是否有任何简化/改进,特别是与我必须创建的三个“路径”相关的?例如,根据latestSubQuery 定义latestCaseId 会很好。

在下面的实际查询的简化形式中,我找到了每个案例组具有最新时间戳的记录集(分布在 ucmpcm 中的字段) 。子查询标识每个组的最新时间戳,以便我们可以通过它过滤外部查询。

  final SimplePath<ListSubQuery> latestSubQueryPath = Expressions.path(ListSubQuery.class, "latest");
  final SimplePath<Timestamp> caseLatestMentioned = Expressions.path(Timestamp.class, "caseLatestMentioned");
  final SimplePath<Integer> latestCaseId = Expressions.path(Integer.class, "latest.caseId");

  final ListSubQuery<Tuple> latest = new SQLSubQuery()
          .from(ucm2)
          .innerJoin(pcm2).on(ucm2.id.eq(pcm2.id))
          .groupBy(pcm2.caseId)
          .list(pcm2.caseId.as(latestCaseId), ucm2.lastExtracted.max().as(caseLatestMentioned));

  q.from(ucm)
          .join(pcm).on(ucm.id.eq(pcm.id))
          .innerJoin(latest, latestSubQueryPath).on(pcm.caseId.eq(latestCaseId))
          .where(ucm.lastExtracted.eq(caseLatestMentioned));

最佳答案

我相信您可以使用.get(<various Path impls>)方法PathBuilder 。我喜欢的思考方式是创建 final PathBuilder<Tuple> latestSubQueryPath = new PathBuilder<>(Tuple.class, "latest")并加入它 .innerJoin(latest, latestSubQueryPath)正在为子查询创建别名。然后你可以使用.get(<various Path impls>)按如下方式访问字段:

  q.from(ucm)
          .join(pcm).on(ucm.id.eq(pcm.id))
          .innerJoin(latest, latestSubQueryPath).on(pcm.caseId.eq(latestSubQueryPath.get(pcm2.caseId)))
          .where(ucm.lastExtracted.eq(latestSubQueryPath.get(maxLastExtractedDate)));

我还没有运行代码,但希望这是正确的方向。如果没有,明天我手头有相关代码库时会看看。

更新:正如评论中提到的,ucm2.lastExtracted.max()需要别名。我把它称为maxLastExtractedDate并假设它用于别名 ucm2.lastExtracted.max()创建子查询时。

关于sql - QueryDSL 中的路径引用连接到子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30539468/

相关文章:

mysql - 如何判断 MySQL 表的最后更新时间?

php - Doctrine 2 找不到实体类

php - Doctrine 2 的判别器问题

spring-data-jpa - java.lang.AssertionError : No value at JSON path "$[0].sAcctDesc" 错误

mysql - 内部连接到 3 个表但不显示任何内容

mysql - 搜索多个百分号

php - 需要帮助从 ManyToOne 获得 OneToMany 关联

java - Fetch join 导致 N+1 查询或抛出 org.hibernate.QueryException

java - JPA QueryDSL 存在并计数

sql - 索引在 SQL 中很糟糕吗?