gpt4 book ai didi

java - 如何使用 Jooq insertInto 复制和修改表格行

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:17 65 4
gpt4 key购买 nike

我正在使用 Jooq 并尝试在同一个表中生成数据集的近似副本。在此过程中,我想将一个字段的值更新为已知值。我一直在查看文档并尝试变体,但还没有成功。这是我更新 REGISTRATION 表并将“stage”字段设置为值 6(之前为 5)的方法。所以我最终会得到原始数据加上一个只有不同阶段值的重复集。在伪代码中

insert into Registration (select * from Registration where stage=5) set stage=6 

我在下面尝试了这段代码,并认为我可以添加一个“.set(...)”方法来设置值,但这似乎无效。

create.insertInto(REGISTRATION)
.select(
(selectFrom(REGISTRATION)
.where(REGISTRATION.STAGE.eq(5))
)
).execute();

最佳答案

我不知道支持 INSERT .. SELECT .. SET 语法的数据库,如果有这样的语法,它肯定不符合 SQL 标准。这里的前进方向是写:

在 SQL 中:

INSERT INTO registration (col1, col2, col3, stage, col4, col5)
SELECT col1, col2, col3, 6, col4, col5
FROM registration
WHERE stage = 5;

在 jOOQ 中:

create.insertInto(REGISTRATION)
.columns(
REGISTRATION.COL1,
REGISTRATION.COL2,
REGISTRATION.COL3,
REGISTRATION.STAGE,
REGISTRATION.COL4,
REGISTRATION.COL5)
.select(
select(
REGISTRATION.COL1,
REGISTRATION.COL2,
REGISTRATION.COL3,
val(6),
REGISTRATION.COL4,
REGISTRATION.COL5)
.from(REGISTRATION)
.where(REGISTRATION.STAGE.eq(5)))
.execute();

暗含以下静态导入:

import static org.jooq.impl.DSL.*;

在 jOOQ 中,动态

由于您正在寻找动态 SQL 解决方案,因此可以这样做:

static <T> int copy(
DSLContext create, Table<?> table, Field<T> field,
T oldValue, T newValue
) {
List<Field<?>> into = new ArrayList<>();
List<Field<?>> from = new ArrayList<>();

into.addAll(Stream.of(table.fields())
.filter(f -> !field.equals(f))
.collect(toList()));
from.addAll(into);

into.add(field);
from.add(val(newValue));

return
create.insertInto(table)
.columns(into)
.select(
select(from)
.from(table)
.where(field.eq(oldValue))
.execute();
}

关于java - 如何使用 Jooq insertInto 复制和修改表格行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47757273/

65 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com