2017-06-14 136 views
0

我在使用QueryDsl更新具有空值的字段时遇到了问题。QueryDSL:默认情况下,SQLUpdateClause背后的理由忽略空值

例如下面的代码:

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?

回答

0

它使插入语句的生活变得非常简单。

处理更新时,只需检索原始记录,进行必要的更改,然后使用DefaultMapper.WITH_NULL_BINDINGS'上插'修改的记录。