我需要“插入”一个项目列表。
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();我想它会自动获取更新后的字段。如果row已经存在,则不会更新这些值。如果新记录还不存在,它会插入一个新记录。
我偶然看到了这篇关于merge的文档,但是我不知道如何将它翻译成batchMerge。https://www.jooq.org/doc/3.1/manual/sql-building/sql-statements/merge-statement/
我是SQL和JOOQ的新手。我使用PostgreSQL作为数据库。
发布于 2021-08-23 08:49:23
JOOQ的batchMerge()在Postgres上的工作与预期一致。
问题实际上并不在于JOOQ。调用batchMerge的存储库方法的服务被标记为@Transactional。这是一个具有回滚功能的Spring注解。这就是为什么它看起来没有持久化到数据库中的原因。我将其标记为@Transactional(noRollbackFor = CustomException.class)以解决我的问题。
发布于 2021-08-23 06:51:08
目前(从jOOQ 3.15开始),jOOQ中的批执行不能获取生成的in,请参阅:https://github.com/jOOQ/jOOQ/issues/3327
但是,由于您的ID使用的是UUID类型(而不是序列生成的ID),那么您甚至需要服务器来生成ID吗?您也可以在客户端中生成它们,并将它们与其余部分一起插入。
https://stackoverflow.com/questions/68862392
复制相似问题