首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JOOQ中实现batchMerge()

在JOOQ中实现batchMerge()
EN

Stack Overflow用户
提问于 2021-08-20 12:40:40
回答 2查看 226关注 0票数 1

我需要“插入”一个项目列表。

代码语言:javascript
复制
class Item {
 private UUID id;
 private UUID anotherId;
 private List<String> things;
 ...
}

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

我偶然发现了JOOQ的batchMerge,我认为它类似于"upsert“。不幸的是,互联网上几乎没有文档,因为这是JOOQ在撰写本文时提出的一种相当新的方法。

我试过了

代码语言:javascript
复制
List<ItemRecord> items = ... //built from context.newRecord(ITEM) then added to a list
context.batchMerge(items).execute();

我想它会自动获取更新后的字段。如果row已经存在,则不会更新这些值。如果新记录还不存在,它会插入一个新记录。

我偶然看到了这篇关于merge的文档,但是我不知道如何将它翻译成batchMergehttps://www.jooq.org/doc/3.1/manual/sql-building/sql-statements/merge-statement/

我是SQL和JOOQ的新手。我使用PostgreSQL作为数据库。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-23 08:49:23

JOOQ的batchMerge()在Postgres上的工作与预期一致。

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

票数 1
EN

Stack Overflow用户

发布于 2021-08-23 06:51:08

目前(从jOOQ 3.15开始),jOOQ中的批执行不能获取生成的in,请参阅:https://github.com/jOOQ/jOOQ/issues/3327

但是,由于您的ID使用的是UUID类型(而不是序列生成的ID),那么您甚至需要服务器来生成ID吗?您也可以在客户端中生成它们,并将它们与其余部分一起插入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68862392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档