【发布时间】:2021-04-12 10:10:15
【问题描述】:
我一直在使用 Jooq 生成的代码模式进行如下查询:
List<Model> results =
dsl.selectFrom(TABLE_NAME)
.where(TABLE_NAME.ID.eq(id))
.fetchInto(Model.class);
这与 RecordMapperProvider 一起根据表和模型类确定使用哪个 RecordMapper:
RecordMapperProvider recordMapperProvider = new RecordMapperProvider() {
@Override
public <R extends Record, E> RecordMapper<R, E> provide(final RecordType<R> recordType,
final Class<? extends E> type) {
return (RecordMapper<R, E>) recordMappers.getOrDefault(new RecordMapperKey(recordType, type),
new DefaultRecordMapper<>(recordType, type));
}
};
这是我想要完成的一个例子:
List<Model> results =
dsl.select(TABLE_NAME.fields())
.distinctOn(TABLE_NAME.DIFF_COL)
.from(TABLE_NAME)
.where(buildConditions(criteria))
.orderBy(TABLE_NAME.PKEY_COL,
TABLE_NAME.TS_COL.desc())
fetchInto(Model.class);
新查询包括 distinctOn 组件,它正在更改传递给 RecordMapperProvider 的 RecordType。这个新的 RecordType 不再匹配生成的代码。
我的问题是:有没有一种解决方案可以让我在生成的代码中保留原始 RecordType 并在查询中使用 distinctOn 时仍然使用此 RecordMapperProvider 模式?
我遍历了 Jooq 库以查看如何比较 RecordType 对象,并发现它们的相等性基于查询中返回的字段集。我在想,如果我可以使用一个新的比较器来确定一个 RecordType 是否是另一个 RecordType 的子集,那么它仍然可以工作。但是,我发现带有生成代码的原始查询中的字段与使用 distinctOn 的查询中返回的内容不匹配。
【问题讨论】: