java如何使用jooq批量插入而不获取序列号
我想使用jooq对postgres进行批量插入:
List<MyTableRecord> records = new ArrayList<>();
for (Dto dto : dtos) {
Field<Long> sequenceId = SEQUENCE.nextval();
Long id = using(ctx).select(sequenceId).fetchOne(sequenceId);
records.add(mapToRecord(dto, id));
}
using(ctx).batchInsert(records).execute();
问题是,我正在为每一行提取下一个序列号
对于简单的插入,我可以在语句中使用如下字段:
create.insertInto(ID, VALUE)
.values(SEQUENCE.nextval(), val("William"))
.execute();
如何使用批插入来执行此操作
# 1 楼答案
预取所有序列值
您可以使用以下方法预取所需的所有序列值:
通过
using(ctx).nextvals(SEQUENCE, dtos.size())
以RDBMS不可知的方式,这似乎是一个开箱即用的有用功能。我们将考虑将来的Jooq版本:https://github.com/jOOQ/jOOQ/issues/10658不要使用记录
另一种方法是通过
batchInsert()
批处理实际的INSERT
语句,而不是Record.insert()
调用。这样,就可以在语句中放入SEQUENCE.nextval()
表达式。见:https://www.jooq.org/doc/latest/manual/sql-execution/batch-execution/