【问题标题】:jooQ 3.13 insert batch with change one columnjooQ 3.13 插入批次并更改一列
【发布时间】:2020-08-29 10:44:04
【问题描述】:

我在两个数据库中有表 Car。第一个表中的汽车的列详细信息为 TEXT,第二个表中的列详细信息为 JSONB。但是我只有一个带有 TEXT 字段的生成类。如何使用生成的 Car 类批量插入到表 2 中,我需要将字段从 TEXT 更改为 JSONB。 我用dsl.batchInsert(records).execute();插入表格

它是我在 jooq 生成类中的字段

public final TableField<Car, String> DETAILS = createField("details", org.jooq.impl.SQLDataType.TExT.nullable(false).defaultValue(org.jooq.impl.DSL.field("", org.jooq.impl.SQLDataType.TEXT)), this, "");

我需要像dsl.batchInsert(changeTextToJsonB(records)).execute(); 或其他的smth 一样插入第二个表

【问题讨论】:

  • 你能告诉我们你到目前为止所做的尝试吗?为了更好地理解您的设置,我们可以使用的任何代码示例都可能会有所帮助。
  • 添加到主要问题中

标签: java spring jooq


【解决方案1】:

显而易见的答案是生成两组类,每个 DB 一组,但我假设这对你不起作用。

然后您可以实现 custom data type binding 并使用代码生成器将其附加到您的列。您的绑定可以读取一些上下文变量,例如从ThreadLocal 获得快速而肮脏的解决方案,或者从您的Configuration.data() 映射来决定是要委托给VARCHAR 绑定还是JSONB 绑定。

public class TextOrJsonBinding implements Binding<String, String> {

    @Override
    public void set(BindingSetStatementContext<U> ctx) throws SQLException {
        var db = ctx.configuration().data("my-db");

        if ("db1".equals(db))
            SQLDataType.VARCHAR.getBinding().set(ctx);
        else if ("db2".equals(db))
            SQLDataType.JSONB.getBinding().set(ctx);
        else
            throw new DataAccessException("Unsupported DB: " + db);
    }

    // Repeat for all methods
}

通过上述方法,您现在可以为每个数据库设置两种配置(您可能已经这样做了,因为您可能有不同的 DataSource 实例):

Configuration db1 = new DefaultConfiguration();
db1.data("my-db", "db1");

Configuration db2 = new DefaultConfiguration();
db2.data("my-db", "db2");

// Produces VARCHAR bindings
db1.dsl().batchInsert(records).execute();

// Produces JSONB bindings
db2.dsl().batchInsert(records).execute();

【讨论】:

    猜你喜欢
    • 2021-05-23
    • 2018-08-13
    • 2020-12-09
    • 2021-03-27
    • 2020-05-22
    • 2017-12-29
    • 2021-01-20
    • 2013-07-02
    • 2020-03-18
    相关资源
    最近更新 更多