[英]Jooq select query using generated code and distinctOn
我一直在使用 Jooq 生成的代碼模式進行如下查詢:
List<Model> results =
dsl.selectFrom(TABLE_NAME)
.where(TABLE_NAME.ID.eq(id))
.fetchInto(Model.class);
這與 RecordMapperProvider 一起根據表和 model class 確定使用哪個 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 的查詢中返回的內容不匹配。
在這里找到答案: https://www.jooq.org/doc/latest/manual/sql-execution/fetching/record-vs-tablerecord/
我能夠將原始記錄插入為我正在查詢的表生成的 TableRecord 中:
List<MyDisplayRecord> records =
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(MyTable.TABLE.getRecordType());
MyRecordMapper mapper = new MyRecordMapper();
return records.stream().map(mapper::map).collect(toList());
通過這種方式,我能夠重新使用具有此查詢結構的映射器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.