gpt4 book ai didi

java - 使用连接更新 jOOQ 中的行

转载 作者:行者123 更新时间:2023-11-29 02:40:17 25 4
gpt4 key购买 nike

我认为 jOOQ 的更新不支持联接,所以我一直在探索如何解决它...

我的第一个尝试是使用 where in,但问题是 MySQL 不支持 FROM 子句中的目标表:

create
.update(USER)
.set(USER.name, concat(USER.NAME, "some text"))
.where(USER.ID.in(
create
.select(USER.ID)
.from(USER)
.join(TEAM)
.on(USER.TEAM_ID.eq(TEAM.ID))
.where(TEAM.STATE.equal("test"))
))
.execute();

我的第二次尝试是为 USER 使用临时表(灵感来自 this 答案)。问题是,我不知道如何在选择中引用临时表。到目前为止,这是我使用 native SQL 的尝试:

create
.update(USER)
.set(USER.name, concat(USER.NAME, "some text"))
.where(USER.ID.in(
create
.select("user_nested.id") // This line doesn't work
.from("SELECT * FROM user AS user_nested")
.join(TEAM)
.on("user_nested.team_id = team.id")
.where(TEAM.STATE.equal("test"))
))
.execute();

我最终想要结束的查询是这样的:

UPDATE user
SET user.name = concat(user.email, 'some text')
WHERE user.id IN (
SELECT user_nested.id
FROM (SELECT * FROM user) AS user_nested
JOIN team
ON user_nested.team_id = team.id
WHERE team.state = 'test'
);

这可以用 jOOQ 实现吗?如果没有,也许我应该对整个查询使用 native SQL 代码。

编辑:我已经设法让它工作了,但它很笨拙,所以我仍然对替代方法感兴趣。

Janky 工作解决方案:

Field<Long> userId = DSL.field("user_nested.id", Long.class);
create
.update(USER)
.set(USER.NAME, (concat(USER.NAME, "some text")))
.where(USER.ID.in(
create
.select(userId)
.from("(SELECT * FROM user) AS user_nested")
.join(TEAM)
.on("user_nested.team_id = team.id")
.where(TEAM.STATE.equal("test"))
))

最佳答案

I believe joins aren't supported with updates in jOOQ

您可能在想,因为没有 UpdateJoinStep 类型,就像有一个 SelectJoinStep在 jOOQ 中使用更新连接是不可能的。但请注意,SelectJoinStep 只是为了方便。 JOIN运算符是连接两个表的运算符,不是SQL中的关键字。因此,jOOQ 支持它作为 Table 类型的运算符。以您的 SQL 更新为例:

Field<Long> userId = DSL.field("user_nested.id", Long.class);
create
.update(USER.join(TEAM).on(TEAM.ID.eq(USER.TEAM_ID)))
.set(USER.NAME, (concat(USER.NAME, "some text")))
.where(TEAM.STATE.equal("test"))

您可以将上述表表达式传递给 DSLContext.update(Table) ,就像任何其他表达式一样。我怀疑这会使您剩下的问题过时?

关于java - 使用连接更新 jOOQ 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54130698/

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