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

Posted

技术标签:

【中文标题】使用 POJO 仅更新 JOOQ 记录中更改的字段【英文标题】:Update only changed fields in JOOQ record using POJO 【发布时间】:2016-10-26 12:05:43 【问题描述】:

我想使用 POJO 作为源来更新 JOOQ 记录中更改的字段。 Record.from(Object) 几乎是正确的,但根据文档

结果记录的所有值都将其内部“已更改”标志设置为真。

我只希望那些实际发生变化的字段(由 Objects.equals(Object, Object) 确定)更新其标志。

这两个原因是:

我不想触发插入 我只想在更新语句中向数据库发送新值(带宽、并发更新等)

【问题讨论】:

【参考方案1】:

这个实现的原因...

结果记录的所有值都将其内部“已更改”标志设置为 true。

... 很简单:如果事情没有以这种方式实现,就无法强制更新未更改的值。有一些用例需要这样做(例如批处理、避免太多不同的 SQL 字符串等)。 Record.from() 方法与其他 Record 方法一致,例如Record.set(Field, Object).

您可以像这样修补内部更改的标志:

// 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() 也非常适合让用户同时自己实现它,谢谢。 了解哪些字段需要标记为已更改的唯一方法是在更新之前从数据库中加载记录,或者在 pojo 中保持更改状态。在这种情况下,我宁愿直接使用记录对象。 @Lukas,我有类似的工作流程,我得到一个 POJO,我只需要更新非 null 和更改的字段。我尝试的方法是从从数据库中检索对象开始。在空检查和以上更改检查之后,我想确保仅将修改后的字段设置为记录对象。某处做错事并看到以下错误:字段 ('"db"."table"."description"') 不包含在 Row () 中。这是我的代码。 existingRecord.setValue(DSL.val(existingRecord.field(i)), DSL.val(newRecord.getValue(i))); @chetu:我看到你已经问了一个问题:***.com/q/70341411/521799 感谢您的帮助。我非常感谢您为继续改进 JOOQ 库并随时了解任何与 JOOQ 相关的问题所做的努力。

以上是关于使用 POJO 仅更新 JOOQ 记录中更改的字段的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 POJO 记录更新表时出现 Java jOOQ 问题

使用 JOOQ 从 POJO 设置字段为空

在更新语句中排除空列 - JOOQ

从 POJO 到 Record 的 jOOQ 映射器

jOOQ 和自动生成,如何避免表 POJO 中的 UDT 记录

Spring Mongo 仅通过新 POJO 的非空字段进行更新