簡體   English   中英

jooQ 3.13 插入批次並更改一列

[英]jooQ 3.13 insert batch with change one column

我在兩個數據庫中有表 Car。 第一個表中的汽車的列詳細信息為 TEXT,第二個表中的列詳細信息為 JSONB。 但是我只有一個生成的帶有 TEXT 字段的 class 。 如何使用生成的 class Car批量插入表 2,我需要將字段從 TEXT 更改為 JSONB。 我用dsl.batchInsert(records).execute();插入表

它在jooq中的我的領域生成了class

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();這樣插入第二個表或其他

顯而易見的答案是生成兩組類,每個數據庫一組,但我假設這對你不起作用。

然后,您可以實現自定義數據類型綁定並使用代碼生成器將其附加到您的列。 您的綁定可以讀取一些上下文變量,例如從ThreadLocal讀取一個快速而骯臟的解決方案,或者從您的Configuration.data() map 來決定它是要委托給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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM