是否可以在JooQ中通过Fluent模型初始化和保存记录?
我知道你可以生成流畅的设置器,但是当你保存记录时,它会返回一个“int”,所以这样的东西是行不通的:
var resultRecord = dslContext
.newRecord(TBL1)
.setField1("Hello")
.setField2("World")
.store();
有什么办法吗?
jOOQ 中没有这样的方法。多年来,将某些内容存储到数据库时有趣的信息是更新计数。虽然返回一个可以包含更多上下文的对象会很有趣(不仅在 jOOQ 中,而且在 JDBC 中也是如此),但事实并非如此,而且我认为这样的更改不会增加它的重量。
你可以像这样写一个实用程序:
static <R extends UpdatableRecord<R>> store(R r) {
r.store();
return r;
}
现在像这样使用它:
var resultRecord = store(dslContext
.newRecord(TBL1)
.setField1("Hello")
.setField2("World")
);
或者更通用的:
static <T> with(T t, Consumer<? super T> consumer) {
consumer.accept(t);
return r;
}
然后:
var resultRecord = with(dslContext
.newRecord(TBL1)
.setField1("Hello")
.setField2("World"),
r -> r.store()
);
INSERT .. RETURNING
在某种程度上,这是等效的并且可以满足您的需求:
var resultRecord =
dslContext.insertInto(TBL)
.set(TBL.FIELD1, "Hello")
.set(TBL.FIELD2, "World")
.returning()
.fetchOne();
这种方法有更多的数据传输,因为所有列值都从数据库返回,这在您的情况下可能是不必要的。但这是一个选择,特别是如果你想要获取身份/默认值。
在其他语言中(例如 kotlin),这些方法是开箱即用的,例如
let