【问题标题】:Update a column when value is not null JOOQ当值不为空时更新列 JOOQ
【发布时间】:2021-06-18 21:47:41
【问题描述】:

我只想在收到的 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();
    }

【问题讨论】:

  • 保持事务大小,避免事务冲突:Update TABLE table_name SET column_name = value WHERE value IS NOT NULL

标签: java sql spring jooq


【解决方案1】:

除了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() 显式包装您的绑定值,请参阅the manual section about bind values

例如

.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,它没有这个限制,因为它没有可变参数。

【讨论】:

    【解决方案2】:

    在你做的更新语句中

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 2019-07-01
      • 2013-03-09
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 2021-08-16
      相关资源
      最近更新 更多