#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 /