jOOQ:如何将带有投影字段的记录映射到 POJO

问题描述 投票:0回答:1

我正在使用动态列列表(投影)执行选择查询。

final var columns = List.of(...); // List of columns I want, based on REST request parameters.
dsl.select(columns).from(TABLE_1).join(TABLE_2).on(...)...

结果是包含连接表中字段子集的记录。我想将它们映射到 DTO,将缺失字段的属性保留为

null

public record ElementDto(
    @Nullable T property1,
    @Nullable T property2,
    @Nullable T property3,
...
    @Nullable T propertyN
) {}

某些 DTO 属性名称与数据库中的字段名称不同。如果可能的话,我希望避免使用硬编码的列名称注释 DTO,以维护类型安全并防止架构更改。

我尝试使用这样的临时记录映射器:

map(record -> new ElementDto(
    record.get(TABLE_1.FIELD_1),
    record.get(TABLE_1.FIELD_2),
    record.get(TABLE_1.FIELD_3),
...
    record.get(TABLE_2.FIELD_N)
))

问题是,如果记录中不存在该字段,则

Record.get(Field)
方法会引发异常。我缺少的是
Record.getOptional(Field)
Record.get(Field, defaultValue)
方法。

我还检查了

Record.into(Class)
方法,该方法使用 DefaultRecordMapper 通过反射将 Field 名称与 DTO 构造函数中的属性名称进行匹配。但是,就我而言,某些 DTO 属性具有不同的名称。

jOOQ 完成这个映射任务的方式是什么?

java jooq
1个回答
0
投票

我缺少的是 Record.getOptional(Field) 或 Record.get(Field, defaultValue) 方法。

为什么不自己编写一个 1liner 实用程序?

static <T> T getOptional(Record r, Field<T> field) {
    return r.field(field) != null ? r.get(field) : null;
}
© www.soinside.com 2019 - 2024. All rights reserved.