有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    预取所有序列值

    您可以使用以下方法预取所需的所有序列值:

    List<Long> ids = using(ctx)
        .select(sequenceId)
        .from(generateSeries(1, dtos.size()))
        .fetch(sequenceId);
    
    for (int i = 0; i < dtos.size(); i++)
        records.add(mapToRecord(dtos.get(i), ids.get(i)));
    
    using(ctx).batchInsert(records).execute();
    

    通过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/