【问题标题】:JOOQ Howto fetch a result of join into POJO without flattening properties?JOOQ 如何在不展平属性的情况下获取加入 POJO 的结果?
【发布时间】:2020-06-22 10:43:13
【问题描述】:

我有以下查询,我在其中加入表 ABC

  • C 通过 C.B_IDB 相关联
  • B 通过 B.A_IDA 相关联

我想检索一个报告,对于每个C,我还想从相应的BA 中检索字段。 如果只需要字段的子集,那么投影和获取到 POJO(具有来自 CBA 的所需属性)是一种显而易见的方法。

class CReportDTO {
    Long c_id;
    Long c_field1;
    Long c_bid;
    Long b_field1;
    // ...
    CReportDTO(Long c_id, Long c_field1, Long c_bid, Long b_field1) {
        // ...
    }

    // ..
}
public List<CReportDTO> getPendingScheduledDeployments() {
        return dslContext.select(
                C.ID,
                C.FIELD1,
                C.B_ID,
                B.FIELD1,
                B.A_ID
                A.FIELD1,
                A.FIELD2
                )
                .from(C)
                .join(B)
                .on(C.B_ID.eq(B.ID))
                .join(A)
                .on(B.A_ID.eq(A.ID))
                .fetchInto(CReportDTO.class);
    };
}

我的问题

如果需要所有字段,我希望我的报告 DTO 包含 ABC POJO,而不会将它们展平:

class CReportDTO2 {
    C c;
    B b;
    A a;

    CReportDTO2(C c, B b, A a) {
        // ...
    }

    // ..
}

是否可以将我的查询修改为:

  • 包括每个表中的所有字段
  • 将其按摩到CReportDTO2,不要太冗长

【问题讨论】:

    标签: java sql jooq


    【解决方案1】:

    您可以使用 jOOQ 的 DefaultRecordMapper 的一个鲜为人知的功能,方法是使用表示 DTO 嵌套结构的点表示法对字段进行别名:

    public List<CReportDTO> getPendingScheduledDeployments() {
        return dslContext.select(
        // Add these       vvvvvvvvvvvvvvvvvvvv
            C.ID       .as("c.c_id"),
            C.FIELD1   .as("c.c_field1"),
            C.B_ID     .as("c.b_id"),
            B.FIELD1   .as("b.b_field1"),
            B.A_ID     .as("b.a_id")
            A.FIELD1   .as("a.a_field1"),
            A.FIELD2   .as("a.a_field2")
        )
        .from(C)
        .join(B)
        .on(C.B_ID.eq(B.ID))
        .join(A)
        .on(B.A_ID.eq(A.ID))
        .fetchInto(CReportDTO2.class);
    }
    

    Javadoc

    如果 Field.getName() 是 MY_field.MY_nested_field(区分大小写!),则该字段的值将被视为嵌套值 MY_nested_field,它是在嵌套 POJO 上设置的

    请注意,这不适用于您提供的构造函数。您还必须提供一个默认构造函数,并使您的字段成为非最终的(如果它们是)。

    【讨论】:

    • 我可能是错的,但问题似乎是关于将相关对象提取到 CReportDTO2 中。您似乎也提供了答案:stackoverflow.com/questions/38222957/…
    • 谢谢@LukasEder,我不知道这个选项。我正在尝试var selectStep = dslContext.select(DSL.asterisk()).from....,然后是var a = selectStep.fetchInto(A.class) 等,但这失败了org.jooq.exception.MappingException
    • @JasonWarner:这只是一个错字。链接的问题不是严格相关的。
    猜你喜欢
    • 2019-04-04
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2021-10-29
    • 2021-06-30
    • 2013-01-20
    • 2013-06-22
    • 2020-12-07
    相关资源
    最近更新 更多