簡體   English   中英

Jooq select 查詢使用生成的代碼和 distinctOn

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM