我在两个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();
或者其他
显而易见的答案是生成两套类,每个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();