我想使用Jooq查询来获取主要信息和子选择的总和

问题描述 投票:0回答:1

我需要在select语句中使用SUM聚合函数,而不需要连接和分组语句。

这是我的代码的一部分:

dslContext.select(
                T_DAILY_DIAGRAM.DAILY_DIAGRAM_ID.convertFrom(DailyDiagramId::of),
                T_DAILY_DIAGRAM.BALANCING_GROUP_ID.convertFrom(BalancingGroupId::of),
                T_DAILY_DIAGRAM.DIAGRAM_DATE,
                row(
                        T_DAILY_DIAGRAM_REVISION.DAILY_DIAGRAM_REVISION_ID.convertFrom(DailyDiagramRevisionId::of),
                        T_DAILY_DIAGRAM_REVISION.REVISION_NUMBER,
                        T_DAILY_DIAGRAM_REVISION.PROPAGATION_STATUS.convertFrom(DailyDiagramRevisionPropagationStatus::valueOf),
                        multiset(
                               select(
                                       sum(T_DAILY_DIAGRAM_PERIOD.PRODUCTION).as("production")
                               ).from(T_DAILY_DIAGRAM_PERIOD).where(T_DAILY_DIAGRAM_PERIOD.FK_DAILY_DIAGRAM_REVISION_ID.eq(T_DAILY_DIAGRAM_REVISION.ID))
                        ).convertFrom(p -> p == null || p.isEmpty() ? null : (BigDecimal) p.getValue(0, "production")),
                        row(
                                T_DAILY_DIAGRAM_REVISION.CREATED_AT,
                                T_DAILY_DIAGRAM_REVISION.CREATED_BY,
                                T_DAILY_DIAGRAM_REVISION.UPDATED_AT,
                                T_DAILY_DIAGRAM_REVISION.UPDATED_BY
                        ).convertFrom(Records.mapping(MetadataResponse::newWithoutVersion))
                ).convertFrom(Records.mapping(DailyDiagramRevisionListResponse::new)),
                row(
                        T_DAILY_DIAGRAM.CREATED_AT,
                        T_DAILY_DIAGRAM.CREATED_BY,
                        T_DAILY_DIAGRAM.UPDATED_AT,
                        T_DAILY_DIAGRAM.UPDATED_BY,
                        T_DAILY_DIAGRAM.VERSION
                ).convertFrom(Records.mapping(MetadataResponse::newWithoutCA))
        )
                .from(T_DAILY_DIAGRAM)
                .join(T_DAILY_DIAGRAM_REVISION).on(T_DAILY_DIAGRAM_REVISION.FK_DAILY_DIAGRAM_ID.eq(T_DAILY_DIAGRAM.ID).and(T_DAILY_DIAGRAM_REVISION.CLOSING_TIME.isNull()))
                .where(
                        T_DAILY_DIAGRAM.BALANCING_GROUP_ID.eq(balancingGroupId.id().get())
                        .and(T_DAILY_DIAGRAM.DIAGRAM_DATE.between(startDate, endDate)))
                .fetch(Records.mapping(DailyDiagramListResponse::new));

这个解决方案对我有用,但它是丑陋的解决方案。

java spring postgresql jooq
1个回答
0
投票

MULTISET
太棒了,人们想在任何地方使用它。但在这种特殊情况下,我想一个简单的标量、相关子查询就足够了(就像普通的 SQL 一样)

field(
    select(sum(T_DAILY_DIAGRAM_PERIOD.PRODUCTION))
    .from(T_DAILY_DIAGRAM_PERIOD)
    .where(T_DAILY_DIAGRAM_PERIOD.FK_DAILY_DIAGRAM_REVISION_ID
        .eq(T_DAILY_DIAGRAM_REVISION.ID))
).as("production")

请注意,从 jOOQ 3.19 开始,有一个名为 隐式路径相关 的新功能,它将通过让您省略相关性的

WHERE
子句来简化此类子查询:

field(
    select(sum(T_DAILY_DIAGRAM_REVISION.tDailyDiagramPeriod().PRODUCTION))
    .from(T_DAILY_DIAGRAM_REVISION.tDailyDiagramPeriod())
).as("production")
© www.soinside.com 2019 - 2024. All rights reserved.