当前位置: 首页 > 知识库问答 >
问题:

JOOQ如何在不展平属性的情况下获取加入POJO的结果?

宓弘壮
2023-03-14

我有一个以下查询,我在其中连接表ABC

  • C通过C与B相关。B_ID
  • 通过B.A\u ID与A相关

我想检索一个报告,其中对于每个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包含ABCPOJO,而不将它们展平:

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

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

    // ..
}

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

  • 包括每个表中的所有字段
  • 将其按摩到CReportDTO2中,无需过多冗长

共有1个答案

竺鸿骞
2023-03-14

您可以使用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字段。getName()是MY_字段。MY\u nested\u字段(区分大小写!),然后,该字段的值将被视为嵌套值MY\u nested\u字段,该字段在嵌套POJO上设置

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

 类似资料:
  • 我试图在不生成代码的情况下使用JOOQ。我有一个像这样的刀类 一个像这样的Pojo类 当我尝试使用这样的主方法从表中读取时 我可以看到SQL查询运行良好,列出了所有匹配的行,但pojo返回的是null值。我做错了什么?谁能给我指一下正确的方向吗?我真的很感激任何帮助。

  • 或者(甚至更好)在调用之前以某种方式截取序列化,例如: 我想我可以扩展并重写它的方法,但它被声明为,而且我找不到一种简单的方法来创建的新实例,而不为它提供所有类型元数据细节,这实际上是复制Jackson的一个很好的部分。所以我已经放弃了。 我的问题是-如何定制Jackson的序列化,为特定POJO向JSON输出添加额外的内容,而不引入太多的样板代码,并尽可能多地重用默认的Jackson行为。

  • 问题内容: 我正在使用Jackson将应用程序的REST接口序列化为JSON表示形式的POJO域对象。我想为某些类型自定义序列化,以将其他属性添加到POJO中不存在的JSON表示中(例如,添加一些元数据,参考数据等)。我知道如何编写自己的方法,但是在那种情况下,我需要为对象的 每个* 属性显式调用方法,而我所需要的只是 添加 一个附加属性。换句话说,我希望能够编写如下内容: *** 或者(甚至更好

  • 问题内容: 在SQL(SQL Server)中,是否可以从表的标识列中检索下一个ID(整数),而实际上无需插入行?如果删除了最近的行,则不一定是最高ID加1。 我之所以这样问,是因为我们有时不得不用新行更新活动数据库。该行的ID在我们的代码中使用(例如,Switch(ID){Case ID:},并且必须相同。如果我们的开发数据库和实时数据库不同步,最好预先预测一个行ID部署之前。 我当然可以 SE

  • 我想查看项目中的所有类,当我找到一个从“City”派生的类时,我想创建一个该类型的新对象并将其添加到列表中。这允许我添加功能,而无需更新列表。最重要的是,我想在不使用任何库的情况下完成它。我已经找到了类似的主题,但他们使用了org。反思。我希望避免以下情况: