使用 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()
调用。
我有一张 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
列。只需保留对您的 jOOQResult
and/orRecord
的引用,并对其执行多个 map /intoXYZ()
调用。