[英]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.