繁体   English   中英

当值不是 null JOOQ 时更新列

[英]Update a column when value is not null JOOQ

我只想在我收到的 POJO 中给定值不是 null 时更新列。

我想实现这个 SQL:

Update TABLE table_name SET column_name = COALESCE(value, column_name)

这是我在 JOOQ 中写的 function

     public int updateCompany(final Company company) {

        return dslContext.update(COMPANY)
                .set(COMPANY.REGISTERED_NAME, company.getRegisteredName())
                .set(COMPANY.TRADING_NAME, coalesce(COMPANY.TRADING_NAME, company.getTradingName()))
                .set(COMPANY.ADDRESS_ID, coalesce(COMPANY.ADDRESS_ID, company.getAddressId()))
                .where(COMPANY.ID.eq(company.getId()))
                .execute();
    }

在你做的更新声明中

coalesce(<input_value>, column_name)

但是在你做的 jOOQ 查询中

coalesce(column_name, <input_value>)

所以你应该改变顺序

 public int updateCompany(final Company company) {

    return dslContext.update(COMPANY)
            .set(COMPANY.REGISTERED_NAME, company.getRegisteredName())
            .set(COMPANY.TRADING_NAME, coalesce(company.getTradingName(), COMPANY.TRADING_NAME))
            .set(COMPANY.ADDRESS_ID, coalesce(company.getAddressId(), COMPANY.ADDRESS_ID))
            .where(COMPANY.ID.eq(company.getId()))
            .execute();
}

除了Simon Martinelli发现的错误之外,这里的问题是没有重载DSL.coalesce(T, Field<T>...) ,您的代码假设存在。 并非没有道理,通常会有这样的超载。 在这种情况下,没有历史原因。 在 Java 6 中,还没有@SafeVarargs ,而 jOOQ 3.14 仍然支持 Java 6。随着 jOOQ 3.15 不再支持 ZD52387880E2238197,这个 2 可以被修复。 我为此创建了一个问题: https://github.com/jOOQ/jOOQ/issues/11690

同时,您必须使用DSL.val()显式包装您的绑定值,请参阅有关绑定值的手册部分

例如

.set(COMPANY.TRADING_NAME, coalesce(val(company.getTradingName()), COMPANY.TRADING_NAME)
.set(COMPANY.ADDRESS_ID, coalesce(val(company.getAddressId()), COMPANY.ADDRESS_ID))

或者,使用等效的2 参数DSL.nvl(T, Field<T>) function ,它没有此限制,因为它没有 varargs 参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM