簡體   English   中英

JOOQ 如何在不展平屬性的情況下獲取連接到 POJO 的結果?

[英]JOOQ Howto fetch a result of join into POJO without flattening properties?

我有以下查詢,我在其中連接表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不要太冗長

您可以使用 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 上設置的

請注意,這不適用於您提供的構造函數。 您還必須提供默認構造函數,並使您的字段為非最終字段(如果它們是)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM