使用 JOOQ 中的 RecordMapper 将派生列映射到 POJO

Mapping derived columns to POJOs with RecordMapper in JOOQ

我有一张 table 票,我在其中插入票并有一个字段 createdBy 存储该记录创建者的 UserId 整数。在获取过程中,我加入了用户 table 并连接名字和姓氏,我的 DTO 具有创建者连接名称的字段 createdBy。我如何映射派生字段?这是我的参考资料https://www.jooq.org/doc/3.13/manual/sql-execution/fetching/pojos/,我似乎找不到这样的场景

问题不在于联接。问题是映射连接后派生的字符串 createdBy,而在 jooq 生成的记录中 class 是一个整数,因为在数据库中 table 我存储了 userId。

    List<MyTickets> mytickets = create.select(....FIELDS).from(TICKETS_).fetch().into(MyTickets.class);
    @Override
public Field<Integer> field9() {
    return Tickets.TICKETS_.CREATEDBY;
}

在我的回答中,我假设您的计算列将被称为 CREATED_BY_NAME,而不是 CREATED_BY,这是一个已经使用的名称,以避免混淆。

如果这是您经常做的事情,您有几个可能对您感兴趣的选项:

  • 使用视图生成此备选 CREATED_BY_NAME 列。许多数据库也可以插入/更新视图,因此使用视图替换表不会有太大的损失。对于您的客户端逻辑,此列的来源将是透明的。如果你想使用 UpdatableRecord,你必须告诉 jOOQ 的代码生成器视图的底层主键使用 synthetic primary key flag.
  • 与上述视图类似,您可以使用 GENERATED ALWAYS AS ... 语法(或您的方言使用的任何语法)在表中使用计算列。并非所有方言都支持此功能,但这是一个很好的功能,无需额外的视图对象即可将表转换为视图。
  • 如果您想在 jOOQ 代码中继续手动计算此列,您可以编写自己的 DTO / POJO 对象,或者使用 custom code section 扩展代码生成器,在其中生成相关属性 / getter / setter。此方法仅适用于可变 POJO,因为您无法修改不可变 POJO 的构造函数。
  • 您还可以为所有受影响的 POJO 指定一个基 class 并使用生成器策略 (programmatic or configurative) 注入该基 class。然后基础 class 可以为像 CREATED_BY_NAME.
  • 这样的列实现所有 getters / setters
  • 您也可以改用结构类型。您不必将所有列映射到您的 POJO。您还可以将某些列映射到生成的 POJO(不包括 CREATED_BY_NAME)并单独映射 CREATED_BY_NAME 列。只需保留对您的 jOOQ Result and/or Record 的引用,并对其执行多个 map / intoXYZ() 调用。