Использование jsonb_set в обновлении с jOOQ - PullRequest
1 голос
/ 31 октября 2019

У меня есть SQL-запрос для обновления значения status в столбце data типа jsonb в Postgresql, который выглядит следующим образом:

update sample
set updated = now(),
    data = jsonb_set(data, '{status}', jsonb 'CANCELLED', true)
where id = 11;

Мне нужно перевести это на рабочийjOOQ-запрос в моем проекте Kotlin ... У меня пока есть это:

jooq.update(Tables.SAMPLE)
        .set(Tables.SAMPLE.UPDATED, OffsetDateTime.now())
        .set(Tables.SAMPLE.DATA, field("jsonb_set(data, '{status}', jsonb '\"CANCELLED\"', true)"))
        .where(Tables.SAMPLE.ID.eq(id))
        .execute()

Но второй set завершается неудачно с Ни одна из следующих функций не может быть вызвана с предоставленными аргументами сообщение об ошибке ... Какую правильную подпись set я могу использовать здесь?

Я основываю свой синтаксис jOOQ на ответе, который Лукас Эдер предоставил в Использование необработанных выражений значений в UPDATE с jooq

1 Ответ

1 голос
/ 04 ноября 2019

В выражении UPDATE вы должны сопоставить типы данных в предложении SET с обеих сторон. Т.е. SAMPLE.DATA имеет тип Field<T>, поэтому выражение, которое вы устанавливаете, должно также иметь тип Field<T>.

Я предполагаю, что SAMPLE.DATA - это Field<JSONB>, поэтомубудет достаточно написать

.set(SAMPLE.DATA, field("json_set(...)", JSONB.class))

Обратите внимание, что в jOOQ 3.12 появился этот тип JSONB. В предыдущих версиях отсутствовало какое-либо готовое представление jOOQ для типов JSON и JSONB, генератор кода jOOQ мог генерировать тип Field<Object> для столбца SAMPLE.DATA, в случае чего ваш операторскомпилировал бы.

...