使用POJO在JOOQ记录中仅更新已更改的字段

7
我想使用一个POJO作为源来更新JOQQ记录中已更改的字段。 Record.from(Object) 已经非常接近实现,但是根据文档所述,生成的记录将使所有字段的内部“更改”标志设置为true。

所有值的内部“更改”标志都将被设置为 true

我只想更新实际更改的字段(由例如Objects.equals(Object, Object)确定)。

原因如下:

  • 我不想触发插入
  • 我只想在更新语句中向数据库发送新值(带宽,并发更新等)
1个回答

4
这种实现的原因很简单:如果不是这样实现,就无法强制更新未更改的值。有一些使用情况需要这样做(例如批处理、避免太多不同的SQL字符串等)。Record.from() 方法与其他 Record 方法一致,例如 Record.set(Field, Object)。生成的记录将对所有值设置其内部的 "changed" 标志为 true。
您可以像这样修补内部更改标志:
// Load all values and mark them all as "changed"
record.from(object);

// Undo the undesired flags
for (int i = 0; i < record.size(); i++)
    if (Objects.equals(record.get(i), record.original(i)))
        record.changed(i, false);

我还在jOOQ中创建了一个功能请求。也许API可以改进,因为很多人有这个需求:https://github.com/jOOQ/jOOQ/issues/5394


添加一个功能会很棒。Record.original()也非常适合让用户在此期间自行实现,谢谢。 - kag0
唯一知道哪些字段需要标记为已更改的方法是通过在更新之前从数据库加载记录,或在pojo中保持更改状态。在这种情况下,我宁愿直接使用记录对象进行操作。 - Simon
@Lukas,我有类似的工作流程,其中我获得一个POJO,只需更新非空和已更改的字段。我尝试的方法是从数据库中检索对象。在进行空值检查和上述更改检查之后,我希望确保仅将修改后的字段设置为记录对象。我在某个地方做错了,并看到以下错误:字段('"db" ."table" ."description" ')不包含在行()中。这是我的代码。existingRecord.setValue(DSL.val(existingRecord.field(i)), DSL.val(newRecord.getValue(i))); - chetu
@chetu:我看到你已经提出了一个问题:https://dev59.com/UG0NtIcB2Jgan1znIVV7 - Lukas Eder
感谢您的帮助。我非常感激您不断改进JOOQ库并及时解答任何与JOOQ相关的问题。 - chetu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接