当值不为null时更新列jooq

ux6nzvsh  于 2021-07-16  发布在  Java
关注(0)|答案(2)|浏览(530)

我只想在所接收的pojo中给定值不为null时更新列。
我要实现以下sql:

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

这是我用jooq写的函数

  1. public int updateCompany(final Company company) {
  2. return dslContext.update(COMPANY)
  3. .set(COMPANY.REGISTERED_NAME, company.getRegisteredName())
  4. .set(COMPANY.TRADING_NAME, coalesce(COMPANY.TRADING_NAME, company.getTradingName()))
  5. .set(COMPANY.ADDRESS_ID, coalesce(COMPANY.ADDRESS_ID, company.getAddressId()))
  6. .where(COMPANY.ID.eq(company.getId()))
  7. .execute();
  8. }
s1ag04yj

s1ag04yj1#

除了simon martinelli发现的bug之外,这里的问题是没有过载 DSL.coalesce(T, Field<T>...) ,代码假定存在。不无道理,通常会有这样的超载。在这种情况下,没有历史原因。在Java6中,没有 @SafeVarargs 然而,jooq3.14仍然支持java6。随着jooq3.15不再支持java6,这个问题可以得到解决。我为此创建了一个问题:https://github.com/jooq/jooq/issues/11690
同时,必须使用 DSL.val() ,请参阅手册中有关绑定值的部分。
例如

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

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

v2g6jxz6

v2g6jxz62#

在update语句中

  1. coalesce(<input_value>, column_name)

但在jooq查询中

  1. coalesce(column_name, <input_value>)

所以你应该改变顺序

  1. public int updateCompany(final Company company) {
  2. return dslContext.update(COMPANY)
  3. .set(COMPANY.REGISTERED_NAME, company.getRegisteredName())
  4. .set(COMPANY.TRADING_NAME, coalesce(company.getTradingName(), COMPANY.TRADING_NAME))
  5. .set(COMPANY.ADDRESS_ID, coalesce(company.getAddressId(), COMPANY.ADDRESS_ID))
  6. .where(COMPANY.ID.eq(company.getId()))
  7. .execute();
  8. }
展开查看全部

相关问题