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

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

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

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

这两个原因是:

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

【问题讨论】:

    标签: java database orm jooq


    【解决方案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:我看到你已经问了一个问题:stackoverflow.com/q/70341411/521799
    • 感谢您的帮助。我非常感谢您为继续改进 JOOQ 库并随时了解任何与 JOOQ 相关的问题所做的努力。
    猜你喜欢
    • 2022-01-17
    • 2020-06-06
    • 2015-12-14
    • 2018-11-22
    • 2015-03-07
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多