【问题标题】:Implement batchMerge() in JOOQ在 JOOQ 中实现 batchMerge()
【发布时间】:2021-10-22 00:30:07
【问题描述】:

我需要“更新”一个项目列表。

class Item {
 private UUID id;
 private UUID anotherId;
 private List<String> things;
 ...
}

如果某个项目的idanotherId 已经存在,则其他值应替换为新项目。如果不是,则应将项目作为新记录插入。

我遇到了 JOOQ 的 batchMerge,我认为它类似于“upsert”。不幸的是,互联网上的文档很少,因为这是 JOOQ 在撰写本文时的一种相当新的方法。

我试过了

List<ItemRecord> items = ... //built from context.newRecord(ITEM) then added to a list
context.batchMerge(items).execute();

认为它会自动获取更新的字段。如果行已经存在,则值中没有更新。如果新记录尚不存在,它会插入一条新记录。

我遇到了merge 的文档,但我不知道如何将其翻译成batchMergehttps://www.jooq.org/doc/3.1/manual/sql-building/sql-statements/merge-statement/

我对 SQL 和 JOOQ 还很陌生。我正在使用 PostgreSQL 作为数据库。

【问题讨论】:

标签: java sql postgresql jooq


【解决方案1】:

目前(从 jOOQ 3.15 开始),jOOQ 中的批处理执行无法获取生成的 ID,请参阅:https://github.com/jOOQ/jOOQ/issues/3327

但是,由于您使用UUID 类型作为您的 ID(而不是序列生成的类型),您甚至需要服务器来生成 ID 吗?您不妨已经在客户端中生成它们,然后将它们与其余部分一起插入。

【讨论】:

    【解决方案2】:

    JOOQ 的 batchMerge() 可以与 Postgres 一起正常工作。

    问题实际上不在于 JOOQ。为 batchMerge 调用 repo 方法的服务标记为 @Transactional。这是一个具有回滚功能的 Spring 注释。这就是为什么它似乎不会持久保存到数据库的原因。我将其标记为@Transactional(noRollbackFor = CustomException.class) 以解决我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-17
      • 2020-01-02
      • 2013-06-23
      • 2015-08-21
      • 2020-01-04
      • 2020-12-22
      • 2017-09-30
      • 2020-02-21
      相关资源
      最近更新 更多