Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JOOQ:更新空值上的列值_Java_Sql_Jooq - Fatal编程技术网

Java JOOQ:更新空值上的列值

Java JOOQ:更新空值上的列值,java,sql,jooq,Java,Sql,Jooq,我需要在Java上使用JOOQ更新与行关联的整数列的值。如果列的值不为NULL,我知道我可以使用以下代码: context.update(TABLENAME) .set(TABLENAME.COUNTER, TABLENAME.COUNTER.add(incrementValue)) .where(TABLENAME.ID.eq(id)) .execute(); 但是,如果列值为NULL值,我想知道是否可以通过在NULL存在时设置默认值来执行以下操作: context.

我需要在Java上使用JOOQ更新与行关联的整数列的值。如果列的值不为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();
可能吗?我应该怎么做

非常感谢

为什么你的方法不起作用? jOOQ不会将任意Java表达式转换为SQL。也就是说,在将表达式传递给jOOQ之前,您的
TABLENAME.COUNTER==null
检查将在Java中进行计算。它永远不会在SQL中生成。由于生成代码的
TABLENAME.COUNTER
永远不会为
null
,因此条件表达式实际上毫无意义

解决 你可以使用或

您还可以使用Oracle风格的功能:

.set(TABLENAME.COUNTER, 
     nvl2(TABLENAME.COUNTER, TABLENAME.COUNTER.add(incrementValue), inline(0)))
或者,写一个

与往常一样,以上假设您具有以下静态导入:

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

您能想象为后一个语句生成的SQL吗?也许使用CTE是可能的,但我不确定Jooq是否能够生成它。在任何情况下,
TABLENAME.COUNTER,TABLENAME.COUNTER==null
很可能不是正在更新的wor字段的值,而是描述表列的对象,它永远不会为null。我明白,这段代码只是为了显示我正在寻找的行为。
.set(TABLENAME.COUNTER, 
     when(TABLENAME.COUNTER.isNull(), inline(0))
     .otherwise(TABLENAME.COUNTER.add(incrementValue)))
import static org.jooq.impl.DSL.*;