jooQ 3.13插入批处理,更改一列。

问题描述 投票:1回答:1

我在两个DB中都有一个Car表,第一个表中的Car列详情为TEXT,第二个表中的Car列详情为JSONB。在第一个表中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(); 或者其他

java spring jooq
1个回答
0
投票

显而易见的答案是生成两套类,每个DB都有一套,但我假设这对你来说是行不通的。

然后你可以实现一个 自定义数据类型绑定 并使用代码生成器将其附加到你的列上。你的绑定可以读取一些上下文变量,例如从一个 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
}

通过上述方法,你现在可以为每个DB有两个配置(你可能已经有了,因为你可能有不同的 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();

© www.soinside.com 2019 - 2024. All rights reserved.