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

jOOQ定制Pojo

祁英哲
2023-03-14

问题

在代码生成期间,我在配置到自定义POJO的映射时遇到了一些问题。

问题

我已经实现了RecordMapperProvider,但想知道如何注册它以在代码生成阶段使用,或者即使这是可能的?

更多上下文

我喜欢波霍斯

@Override
public <R extends Record, E> RecordMapper<R, E> provide(RecordType<R> recordType,
                                                        Class<? extends E> type) {

    if (mapping.containsKey(type)) {
        return record -> modelMapper.map(mapping.get(type), type);
    }

    return new DefaultRecordMapper<>(recordType, type);
}

如果有帮助,我将使用DefaultConfiguration对象(一个bean)配置jOOQ:

@Bean
public DefaultConfiguration configuration() {
    DefaultConfiguration jooqConfiguration = new DefaultConfiguration();
    jooqConfiguration.setConnectionProvider(dataSourceConnectionProvider());
    jooqConfiguration.setExecuteListenerProvider(new DefaultExecuteListenerProvider(
            jooqToSpringExceptionTranslator()));
    jooqConfiguration.setSQLDialect(
            SQLDialect.valueOf(env.getRequiredProperty("jooq.sql.dialect")));
    jooqConfiguration.setRecordMapperProvider(new JooqRecordMapperFactory(modelMapper()));

    return jooqConfiguration;
}

然后对于代码生成,我在gradle中配置它:

jooq {
version = '3.10.5'
edition = 'OSS'

myDb(sourceSets.getByName("main")) {
    jdbc {
        driver = dbDriver
        url = dbUrl
        user = dbUsername
    }
    generator {
        name = 'org.jooq.util.JavaGenerator'
        strategy {
            name = 'org.jooq.util.DefaultGeneratorStrategy'
        }
        database {
            name = 'org.jooq.util.postgres.PostgresDatabase'
            inputSchema = dbSchema
        }
        generate {
            relations = true
            deprecated = false
            records = true
            immutablePojos = true
            fluentSetters = true
            daos = true
        }
        target {
            packageName = 'com.textiq.quinn.common.dao.model.generated'
        }
    }
}
}

我确信这两种配置之间存在脱节,但我无法从文档中了解如何同步这些配置。理想情况下,我希望jOOQ生成POJO(基于我的RecordMapperProvider实现中ModelMapper提供的映射),并让jOOQ为这些POJO提供DAO。这可能吗?文件说明:

如果您使用的是jOOQ的代码生成器,您可以将其配置为为生成POJO,但不需要使用生成的POJO。你可以用你自己的。请参阅手册中关于使用自定义记录映射器的POJO的部分,了解如何修改jOOQ的标准POJO映射行为。

资料来源:https://www.jooq.org/doc/3.9/manual/sql-execution/fetching/pojos/

对我来说,这表明了这一点的可能性,但只导致我实现了RecordMapperProvider,之后什么都没有。

共有2个答案

娄弘
2023-03-14

我参加聚会迟到了几年,但实际上我找到了一个非常简单的方法。我承认它有点脆弱,但你可以进一步改进它以满足你的需要。

  1. 在您的gradle项目中创建一个新模块,例如称为jooq生成器
  2. 将jooq-codesen作为compileOnly依赖项添加到模块
  3. 在模块中创建一个新类:
public class Generator extends JavaGenerator {
    @Override
    public boolean generatePojos() {
        return false;
    }
}

public class MyGeneratorStrategy extends DefaultGeneratorStrategy {
   @Override
   public String getJavaPackageName(Definition definition, Mode mode) {
       if (mode != Mode.POJO) {
           return super.getJavaPackageName(definition, mode);
       }
       return "com.example.my.model.package.prefix";
   }

}
jooq {
    configurations {
        main {
            generationTool {
                generator {
                    name = 'com.example.my.package.name.Generator'
                    strategy {
                        name = 'com.example.my.package.name.MyGeneratorStrategy'
                    }
                }
            }
        }
    }
}
舒仲渊
2023-03-14

我已经实现了RecordMapperProvider,但我想知道如何注册它以在代码生成阶段使用,或者即使这是可能的?

不,这是不可能的,开箱即用。

我喜欢波霍斯

然后,我建议关闭POJO和DAO的生成并滚动您自己的。要么,创建DAO的手动实现,要么扩展JavaGenerator来做到这一点。

 类似资料:
  • 我们有一些反映到多个数据库字段的自定义类型。例如 存储为3个单独的db字段。总是写作很无聊 然后从相应的记录字段中获取记录并创建PersonName类型。 其思想是定义一些多列自定义字段,在查询执行期间由jooq将其扩展为三个“真实”字段,并打包到结果中的一个PersonName对象。 看起来用可以做这样的事情,但我想知道,可能已经有解决这种情况的方法了。

  • 我有一个特定的Postgre架构,它收集所有定义类型的表,如,其中的值可以是,等。 我们需要获取所有这些表,并根据它们生成枚举,以便以后在我们的应用程序中使用。因此,这些枚举应该如下所示: 我们决定使用JOOQ看起来很有趣,但是我们找不到留档/示例来创建一个使用默认java生成器行为加上自定义枚举生成扩展的自定义生成器。 基于这篇文章用JOOQ从表中生成枚举类,它带来了一些想法,但仍然不清楚如何实

  • jOOQ 高效的合并了复杂 SQL、类型安全、源码生成、Active Records、存储过程以及高级数据类型的 Java 类库。 示例代码: // Create a new record and insert it into the databaseTBookRecord book = create.newRecord(T_BOOK);book.setTitle("My first book")

  • 我正在尝试为PGInterval和Duration编写一个自定义数据类型绑定,以将jOOQ与TimescaleDB一起使用。遗憾的是,jOOQ在为数据库例程生成函数时没有使用它。 这是我的绑定类: 这是我在pom中的配置: 例如,我希望jOOQ生成例程 像 但是我得到了

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

  • 对于多个数据库(和数据库服务器),我有完全相同的数据库定义。我如何告诉Jooq使用与我创建的连接到DB的“连接”相同的数据库? 示例(对于MySQL): jdbc:mysql://localhost:3306/tsm-我的开发数据库(tsm),用于生成代码 所有3个数据库都具有相同的定义、相同的表、索引等。TSM one是我们的应用程序使用的标准。 也许我应该使用DSL。使用(连接、设置)而不是?