我正在使用动态列列表(投影)执行选择查询。
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 完成这个映射任务的方式是什么?
我缺少的是 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;
}