JOOQ 插入记录列表
Posted
技术标签:
【中文标题】JOOQ 插入记录列表【英文标题】:JOOQ Insert List of records 【发布时间】:2020-08-04 16:28:16 【问题描述】:目前我正在从 pojo 列表映射到记录,并且我希望能够一次插入多行。我如何在 JOOQ 中通过一笔交易做到这一点?
List<Record> recordList = receiverList.stream().map(r ->
return dslContext.newRecord(Table, r);
).collect(Collectors.toList());
我尝试将列表放在“值”中,但出现异常“值的数量必须与字段的数量匹配”
dslContext.insertInto(Table).values(recordList);
【问题讨论】:
values(Collection)
方法旨在用于单个记录插入的字段或值的集合。
【参考方案1】:
您的错误是因为 .values(...) 正在等待字段值而不是记录。
也许你可以做a batch execution:
dslContext.batchInsert(recordList);
正如 Lukas 所说,它将在单个 jdbc 语句中执行它,该语句是原子的
【讨论】:
谢谢@LukasEder 我会编辑我的答案以更正它【参考方案2】:你也可以用 batchInsert 代替:
var insertStepN = dslContext.insertInto(Table).set(dslContext.newRecord(Table, recordList.get(0));
for (var record : recordList.subList(1, recordList.size())
insertStepN = insertStepN.newRecord().set(dslContext.newRecord(Table, record));
insertStepN.returning().fetch().into(YourClass.class);
通过这种方式,您可以使用返回() 取回插入的值,而使用 batchInsert() 则无法获得。
【讨论】:
以上是关于JOOQ 插入记录列表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JOOQ 在 PostgreSQL 中插入带有 JSON 列的可更新记录?