Обновление строк в jOOQ с помощью объединений - PullRequest
0 голосов
/ 10 января 2019

Я считаю, что объединения не поддерживаются с обновлениями в 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"))
    ))

1 Ответ

0 голосов
/ 10 января 2019

Я считаю, что объединения не поддерживаются с обновлениями в jOOQ

Вы, вероятно, думаете, что из-за отсутствия типа UpdateJoinStep, такого как SelectJoinStep, использование соединения с обновлениями невозможно в jOOQ. Но знайте, что SelectJoinStep - это просто удобство. Оператор JOIN - это оператор, который соединяет две таблицы, а не ключевое слово в SQL. Таким образом, jOOQ поддерживает его как оператор типа Table:

Table<?> joined = A.join(B).on(P);

Вы можете передать приведенное выше табличное выражение в DSLContext.update(Table), как и любое другое. Я подозреваю, что это устарело ваш оставшийся вопрос?

...