JooQ:流畅的记录初始化和保存

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

是否可以在JooQ中通过Fluent模型初始化和保存记录?

我知道你可以生成流畅的设置器,但是当你保存记录时,它会返回一个“int”,所以这样的东西是行不通的:

var resultRecord = dslContext
    .newRecord(TBL1)
    .setField1("Hello")
    .setField2("World")
    .store();

有什么办法吗?

sql jooq
1个回答
0
投票

没有这样的方法

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

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