gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:00:57 26 4
gpt4 key购买 nike

我有以下连接表的查询 A , B , 和 C :

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

  • 我想检索一份报告,其中每个 C ,我还想从相应的 B 中检索字段和 A .
    如果只需要字段的子集,则投影和提取到 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 包含 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);
    }

    Javadoc

    If Field.getName() is MY_field.MY_nested_field (case-sensitive!), then this field's value will be considered a nested value MY_nested_field, which is set on a nested POJO



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

    关于java - JOOQ 如何在不展平属性的情况下获取连接到 POJO 的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60619252/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com