Я считаю, что объединения не поддерживаются с обновлениями в jOOQ, поэтому я изучал, как обойти это ...
Моя первая попытка была использовать где, но проблема в том, что 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 (вдохновленный этим ответом). Проблема в том, что я не могу понять, как ссылаться на временную таблицу в select. Вот моя попытка до сих пор использовать нативный 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? Если нет, возможно, мне следует использовать собственный код 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"))
))