JOOQ 如何在不展平属性的情况下获取连接到 POJO 的结果?

Les*_*iak 5 java sql jooq

我有以下查询,我连接表AB以及C

  • CB通过有关C.B_ID
  • BA通过有关B.A_ID

我想检索一份报告,其中对于每个C,我还想从相应的B和 中检索字段A。如果只需要字段的子集,则投影和提取到 POJO(具有来自C, B, 的必需属性A)是一种显而易见的方法。

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) {
        // ...
    }

    // ..
}
Run Code Online (Sandbox Code Playgroud)
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);
    };
}
Run Code Online (Sandbox Code Playgroud)

我的问题

如果需要所有字段,我希望我的报告 DTO 包含A, B, CPOJO,而不是将它们展平:

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

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

    // ..
}
Run Code Online (Sandbox Code Playgroud)

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

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

Luk*_*der 4

您可以使用 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);
}
Run Code Online (Sandbox Code Playgroud)

参见Javadoc

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

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