Mat*_*tch 4 java mysql sql jooq
我相信 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();
Run Code Online (Sandbox Code Playgroud)
我的第二个尝试是用于用户临时表(灵感来自这个答案)。问题是,我不知道如何在选择中引用临时表。到目前为止,这是我使用本机 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();
Run Code Online (Sandbox Code Playgroud)
我最终想要得到的查询类似于:
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'
);
Run Code Online (Sandbox Code Playgroud)
这可以用 jOOQ 实现吗?如果没有,也许我应该对整个查询使用本机 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"))
))
Run Code Online (Sandbox Code Playgroud)
我相信 jOOQ 中的更新不支持连接
您可能会想,因为没有任何UpdateJoinStep类型很像SelectJoinStepjOOQ 中不可能使用带有更新的连接。但请注意,这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"))
Run Code Online (Sandbox Code Playgroud)
您可以将上表表达式传递给DSLContext.update(Table)任何其他表达式。我怀疑这已经过时了你剩下的问题?
| 归档时间: |
|
| 查看次数: |
1834 次 |
| 最近记录: |