我想知道在连接到子查询的 SQL 样式 QueryDSL 中实现此查询的最佳方法。我费了一番功夫,但还是让它生成了必要的 SQL。然而,我想知道是否有任何简化/改进,特别是与我必须创建的三个“路径”相关的?例如,根据latestSubQuery 定义latestCaseId 会很好。
在下面的实际查询的简化形式中,我找到了每个案例组具有最新时间戳的记录集(分布在 ucm
和 pcm
中的字段) 。子查询标识每个组的最新时间戳,以便我们可以通过它过滤外部查询。
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/