JOOQ: обновить значения столбца на нулевые значения - PullRequest
0 голосов
/ 14 сентября 2018

Мне нужно обновить значение целочисленного столбца, связанного со строкой, используя JOOQ на Java.Если значение столбца не равно NULL, я знаю, что могу использовать этот код:

context.update(TABLENAME)
    .set(TABLENAME.COUNTER, TABLENAME.COUNTER.add(incrementValue))
    .where(TABLENAME.ID.eq(id))
    .execute();

Однако, если значение столбца имеет значение NULL, мне интересно, смогу ли я сделать что-то подобное, установивзначение по умолчанию в присутствии NULL:

context.update(TABLENAME)
    .set(TABLENAME.COUNTER, TABLENAME.COUNTER == null ? 0 : TABLENAME.COUNTER.add(incrementValue))
    .where(TABLENAME.ID.eq(id))
    .execute();

Возможно ли это?Как мне это сделать?

Большое спасибо!

1 Ответ

0 голосов
/ 15 сентября 2018

Почему ваш подход не работает?

jOOQ не переводит произвольные выражения Java в SQL.Т.е. ваша проверка TABLENAME.COUNTER == null вычисляется в Java до передачи выражения в jOOQ.Он никогда не будет сгенерирован в SQL.А поскольку TABLENAME.COUNTER, будучи генерируемым кодом, никогда не будет null, условное выражение действительно бессмысленно.

Решения

Вы можете использовать DSL.coalesce() илиDSL.nvl() или DSL.ifnull()

.set(TABLENAME.COUNTER, coalesce(TABLENAME.COUNTER, inline(-1)).add(incrementValue))

Существует также функция стиля Oracle DSL.nvl2(), которую можно использовать:

.set(TABLENAME.COUNTER, 
     nvl2(TABLENAME.COUNTER, TABLENAME.COUNTER.add(incrementValue), inline(0)))

В качестве альтернативы, напишите CASE выражение

.set(TABLENAME.COUNTER, 
     when(TABLENAME.COUNTER.isNull(), inline(0))
     .otherwise(TABLENAME.COUNTER.add(incrementValue)))

Как всегда, вышеизложенное предполагает, что у вас есть следующий статический импорт:

import static org.jooq.impl.DSL.*;
...