Java JOOQ:更新空值上的列值
我需要在Java上使用JOOQ更新与行关联的整数列的值。如果列的值不为NULL,我知道我可以使用以下代码: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.
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.*;