【问题标题】:Update only changed fields in JOOQ record using POJO with partial data使用带有部分数据的 POJO 仅更新 JOOQ 记录中的更改字段
【发布时间】:2022-01-17 07:46:44
【问题描述】:

我有一个与以下帖子非常相似的问题,但略有不同。 Update only changed fields in JOOQ record using POJO

我为创建和更新调用获得了相同的 JSON 对象。在更新调用中,我可能不会收到所有字段,因此我想确保只更新更改的字段,而不是替换未提供 null 的字段。对数据库没有约束。

我遵循上述答案,但稍作修改就遇到了错误。

UserRecord existingRecord = existingUserRecordOptional.get();
UserRecord newUserRecord = new UserRecord();
newUserRecord.from(userPojo);

for (int i = 0; i < newRecord.size(); i++) {
   if (nonNull(newRecord.get(i)) && !Objects.equals(existingConsumerRecord.get(i), newRecord.get(i))) {
      existingUserRecord.setValue(DSL.val(existingUserRecord.field(i)), DSL.val(newUserRecord.getValue(i)));
   }
}

我收到的错误是:

字段 ('"db"."table"."description"') 不包含在行 (...) 中

【问题讨论】:

    标签: java jooq


    【解决方案1】:

    改为这样做:

    existingUserRecord.setValue(
      // Don't wrap this in DSL.val()
      (Field) existingUserRecord.field(i), 
      DSL.val(newUserRecord.getValue(i))
    );
    

    DSL.val() 用于创建绑定值。

    但是,既然您已链接到 the previous question,为什么不直接采用不会在记录之间复制值的方法呢?您可以使用 newUserRecord 并取消设置您不想发送到数据库的列的所有更改标志。

    【讨论】:

    • 即使使用以前的方法,它仍然会用 null 覆盖现有值,因此探索这条从数据库加载记录并将更改的值设置为记录对象的路线。我仍在调试为什么其他方法不起作用。 JOOQ 和代码库的新手,所以需要更长的时间。
    • 这个流程为我解决了这个问题。使用上一个问题中的方法,它对我不起作用,因为 POJO 的某些设置方式和命名与 DB 字段不匹配。我将承担重构任务以简化此问题。我计划探索 JPA 注释路线,看看是否可以更好地重构代码。
    猜你喜欢
    • 2016-10-26
    • 2020-06-06
    • 2015-12-14
    • 2019-06-03
    • 1970-01-01
    • 2021-07-21
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多