Как выполнить пакетную вставку с помощью jooq без получения порядкового номера

#java #database #code-generation #jooq

#java #База данных #генерация кода #jooq

Вопрос:

Я хочу выполнить пакетную вставку в postgres с помощью jooq:

 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();
  

Проблема в том, что я выбираю следующий порядковый номер для каждой строки.

Для простой вставки я могу использовать Field в инструкции следующим образом:

 create.insertInto(ID, VALUE)
  .values(SEQUENCE.nextval(), val("William"))
  .execute();
  

Как я могу сделать это с помощью пакетной вставки?

Ответ №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()) . Мы рассмотрим это для будущей версии jOOQ: https://github.com/jOOQ/jOOQ/issues/10658

Не используйте записи

Альтернативой является пакетное выполнение фактических INSERT операторов вместо Record.insert() вызовов через batchInsert() . Таким образом, вы можете поместить SEQUENCE.nextval() выражение в инструкцию. Смотрите: https://www.jooq.org/doc/latest/manual/sql-execution/batch-execution /