【问题标题】:Mapping derived columns to POJOs with RecordMapper in JOOQ在 JOOQ 中使用 RecordMapper 将派生列映射到 POJO
【发布时间】:2020-06-11 12:02:41
【问题描述】:

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

问题不在于加入。问题是映射连接后派生的字符串 createdBy 而在 jooq 生成的记录类中是一个整数,因为在数据库表中我存储了用户 ID。

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

【问题讨论】:

  • 只需加入即可。还是我不明白你的问题?也许你应该展示你到目前为止所做的尝试。 stackoverflow.com/help/how-to-ask
  • 问题不在于加入。问题是映射连接后派生的字符串 createdBy 而在 jooq 生成的记录类中是一个整数,因为在数据库表中我存储了 userId。
  • 啊,我明白了。那么为什么要使用生成的记录作为结果呢?创建 DTO
  • 所以它会绕过记录?我是 jooq 的新手,对它了解不多
  • 您已经指向正确的 jOOQ 手册页:jooq.org/doc/3.13/manual/sql-execution/fetching/pojos MyBook 不是生成的记录它是自定义 DTO

标签: java spring-boot jooq


【解决方案1】:

在我的回答中,我假设您的计算列将被称为 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 指定一个基类,并使用生成器策略(programmaticconfigurative)注入该基类。然后,基类可以为 CREATED_BY_NAME 等列实现所有 getter/setter。
  • 您也可以改用结构类型。您不必将所有列映射到您的 POJO。您还可以将一些列映射到生成的 POJO(不包括 CREATED_BY_NAME)并分别映射 CREATED_BY_NAME 列。只需保留对您的 jOOQ Result 和/或 Record 的引用,然后对其执行几次 map / intoXYZ() 调用。

【讨论】:

  • 谢谢。我使用了 DTO,它有效,但其他点也很有趣,会记下它们
猜你喜欢
  • 2017-04-20
  • 2016-03-05
  • 2020-12-26
  • 2019-12-30
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2019-09-03
相关资源
最近更新 更多