我在使用 QueryDsl 更新具有空值的字段时遇到了问题。
例如,以下代码:
entity.setText(null);
new SQLUpdateClause(connection, templates, QEntity )
.where(...)
.populate(entity)
.execute();
静默忽略"文本"字段上的更新。
挖掘代码,我想出了一种正确设置空值的方法:
entity.setText(null);
new SQLUpdateClause(connection, templates, QEntity )
.where(...)
.populate(entity, DefaultMapper.WITH_NULL_BINDINGS)
.execute();
这会导致几个问题:
- 静默错误:忘记更新映射器可能会导致以后难以找到错误,因为更新不会引发异常。 API
- 复制:需要向现有的 updateEntity API 添加"updateNulls"标志,以保持兼容性。
决定默认忽略更新空值背后的理由是什么?抛出异常会破坏现有 API 吗?
它使插入语句的生活变得非常容易。
处理更新时,只需检索原始记录,进行必要的更改,然后使用DefaultMapper.WITH_NULL_BINDINGS"更新"修改后的记录。