当前位置: 首页 > 知识库问答 >
问题:

Jooq使用生成的代码和distinctOn选择查询

晋安国
2023-03-14

我一直在使用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);

新的查询包含了该组件,并且它正在改变传递给RecordMapperProvider的RecordType。这个新的RecordType不再与生成的代码匹配。

我的问题是:是否有一种解决方案,可以在查询中使用distinctOn时保留生成代码中的原始记录类型,并仍然使用此RecordMapperProvider模式?

我遍历了Jooq库,查看了如何比较RecordType对象,并发现它们的相等性是基于查询中返回的字段集。我在想,如果我可以使用一个新的比较器来确定一个记录类型是否是另一个记录类型的子集,那么它仍然可以工作。但是,我发现原始查询中包含生成代码的字段与使用distinctOn的查询中返回的字段不匹配。

共有1个答案

周宏伯
2023-03-14

在这里找到了答案: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());

这样,我就可以用这个查询结构重用映射器。

 类似资料:
  • 我试图使用JOOQ连接到HSQLDB,但我失败了,这里是错误消息: 此查询也会在HSQLDB Manager上失败(与JOOQ代码生成器的错误相同): 此查询工作正常: 我认为问题出在“cc”限定符上(在查询返回的“CONSTRAINT_NAME”字段上),这是HSQLDB错误吗? 我正在使用: HSQLDB 2.3.1 JOOQ 3.2.3 谢谢Ciccio

  • 我更改了数据库中的一些表,所以我想生成记录、键、类等。但是每次我这样做时,它总是跳过jooq代码生成。 [INFO]--jooq-codegen-maven:3.11.10:generate(默认cli)@http网关--[INFO]跳过jooq代码生成 为了运行Jooq代码生成,我应该执行哪个mvn cmd?现在我使用: 谢谢

  • 我使用jOOQ程序代码生成数据库,但现在我遇到了一些问题。在数据库中,我有表A和表B。第一次都生成了pojo、dao、接口等。经过一段时间的开发,我发现表A需要添加一些字段或修改一些字段,所以我不得不再次编码,然后jOOQ代码生成器将覆盖现有的代码,这让我很难过。当我在排除表的情况下使用“排除A”时,发现只生成了表A的数据,表B将被删除。我不知道如何处理这个问题。我的代码生成器如下:

  • 是否有任何参数可以在jooq代码生成期间打开/关闭下一个查询的执行? 在有大量模式和对象的数据库上,执行大约需要一个小时

  • 我目前正在评估Jooq。我们在创建join语句时遇到了一些问题,如下所示: 但这并不奏效。我仍然有以为类型的字段。那么除了更改表列类型之外,我还能做些什么呢?

  • 我有一个有许多表的数据库。我想开始使用jOOQ为我的应用程序。但是我不希望JOOQ为所有表生成代码,但只为表的一小部分生成代码。我如何配置它?