jooq select查询

6l7fqoea  于 2021-06-26  发布在  Java
关注(0)|答案(0)|浏览(252)

我一直在使用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的记录类型。此新记录类型与生成的代码不再匹配。
我的问题是:有没有一个解决方案,我可以从生成的代码中保留原始的记录类型,并且在查询中使用distincton时仍然使用这个recordmapperprovider模式?
我遍历了jooq库来查看如何比较recordtype对象,并发现它们的相等性是基于查询中返回的字段集。我在想,如果我可以使用一个新的比较器来确定一个记录类型是否是另一个记录类型的子集,那么它仍然可以工作。但是,我发现原始查询中包含生成代码的字段与使用distincton的查询中返回的不匹配。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题