[英]JOOQ Howto fetch a result of join into POJO without flattening properties?
我有以下查詢,我在其中連接表A
、 B
和C
:
C
通過C.B_ID
與B
相關B
通過B.A_ID
與A
相關我想檢索一份報告,其中對於每個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) {
// ...
}
// ..
}
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 包含A
、 B
、 C
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);
}
如果 Field.getName() 是 MY_field.MY_nested_field(區分大小寫!),則該字段的值將被視為嵌套值 MY_nested_field,它是在嵌套的 POJO 上設置的
請注意,這不適用於您提供的構造函數。 您還必須提供默認構造函數,並使您的字段為非最終字段(如果它們是)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.