在 JOOQ 中实现 batchMerge()
Implement batchMerge() in JOOQ
我需要“更新”项目列表。
class Item {
private UUID id;
private UUID anotherId;
private List<String> things;
...
}
如果项目的 id
和 anotherId
已经存在,其他值应该被新项目替换。如果不是,项目应该作为新记录插入。
我看到了 JOOQ 的 batchMerge
,我认为它类似于“upsert”。不幸的是,互联网上的文档很少,因为这是 JOOQ 在撰写本文时采用的一种相当新的方法。
我试过了
List<ItemRecord> items = ... //built from context.newRecord(ITEM) then added to a list
context.batchMerge(items).execute();
认为它会自动获取更新的字段。如果行已存在,则值不会更新。如果新记录尚不存在,它确实会插入新记录。
我看到了 merge
的文档,但我不知道如何将其翻译成 batchMerge
。 https://www.jooq.org/doc/3.1/manual/sql-building/sql-statements/merge-statement/
我对 SQL 和 JOOQ 还很陌生。我正在使用 PostgreSQL 作为数据库。
目前(自 jOOQ 3.15 起),jOOQ 中的批处理无法获取生成的 ID,请参阅:https://github.com/jOOQ/jOOQ/issues/3327
但是,由于您使用的是 UUID
类型的 ID(而不是序列生成的 ID),您是否还需要服务器来生成 ID?您不妨在客户端中生成它们,然后将它们与其余部分一起插入。
JOOQ 的 batchMerge()
与 Postgres 一起正常工作。
实际上问题不在于 JOOQ。为 batchMerge 调用 repo 方法的服务被标记为 @Transactional
。这是一个具有回滚功能的 Spring 注释。这就是为什么它似乎不会持久保存到数据库中的原因。我将其标记为 @Transactional(noRollbackFor = CustomException.class)
来解决我的问题。
我需要“更新”项目列表。
class Item {
private UUID id;
private UUID anotherId;
private List<String> things;
...
}
如果项目的 id
和 anotherId
已经存在,其他值应该被新项目替换。如果不是,项目应该作为新记录插入。
我看到了 JOOQ 的 batchMerge
,我认为它类似于“upsert”。不幸的是,互联网上的文档很少,因为这是 JOOQ 在撰写本文时采用的一种相当新的方法。
我试过了
List<ItemRecord> items = ... //built from context.newRecord(ITEM) then added to a list
context.batchMerge(items).execute();
认为它会自动获取更新的字段。如果行已存在,则值不会更新。如果新记录尚不存在,它确实会插入新记录。
我看到了 merge
的文档,但我不知道如何将其翻译成 batchMerge
。 https://www.jooq.org/doc/3.1/manual/sql-building/sql-statements/merge-statement/
我对 SQL 和 JOOQ 还很陌生。我正在使用 PostgreSQL 作为数据库。
目前(自 jOOQ 3.15 起),jOOQ 中的批处理无法获取生成的 ID,请参阅:https://github.com/jOOQ/jOOQ/issues/3327
但是,由于您使用的是 UUID
类型的 ID(而不是序列生成的 ID),您是否还需要服务器来生成 ID?您不妨在客户端中生成它们,然后将它们与其余部分一起插入。
JOOQ 的 batchMerge()
与 Postgres 一起正常工作。
实际上问题不在于 JOOQ。为 batchMerge 调用 repo 方法的服务被标记为 @Transactional
。这是一个具有回滚功能的 Spring 注释。这就是为什么它似乎不会持久保存到数据库中的原因。我将其标记为 @Transactional(noRollbackFor = CustomException.class)
来解决我的问题。