当值不为空时更新列 JOOQ

雅舍尔·维亚斯

我想仅当我收到的 POJO 中的给定值不为空时才更新列。

我想实现这个 SQL:

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

这是我在 JOOQ 中编写的函数

     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();
    }
卢卡斯·埃德

除了Simon Martinelli发现的错误之外,这里的问题是没有DSL.coalesce(T, Field<T>...)你的代码假设有的重载并非不合理,通常会有这样的超载。在这种情况下,没有历史原因。在 Java 6 中,还没有@SafeVarargs,而且 jOOQ 3.14 仍然支持 Java 6。随着 jOOQ 3.15 不再支持 Java 6,这可以修复。我为此创建了一个问题: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-argument DSL.nvl(T, Field<T>)function,它没有此限制,因为它没有 varargs 参数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章