2 votes

Comment faire une insertion par lot en utilisant jooq sans récupérer le numéro de séquence ?

Je veux faire des insertions par lot dans postgres en utilisant 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();

Le problème est que je récupère le numéro de séquence suivant pour chaque ligne.

Pour une simple insertion, je peux utiliser Field dans une déclaration comme celle-ci :

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

Comment puis-je le faire avec l'insertion par lots ?

1voto

Lukas Eder Points 48046

Récupération préalable de toutes les valeurs de la séquence

Vous pourriez récupérer à l'avance toutes les valeurs de séquence dont vous avez besoin en utilisant cette méthode :

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

Cela semble être une fonctionnalité utile à avoir dès le départ, d'une manière agnostique par rapport au SGBD via le système de gestion des données. using(ctx).nextvals(SEQUENCE, dtos.size()) . Nous en tiendrons compte dans une prochaine version de jOOQ : https://github.com/jOOQ/jOOQ/issues/10658

N'utilisez pas d'enregistrements

Une autre solution consiste à regrouper les données réelles INSERT au lieu de Record.insert() appels via batchInsert() . De cette façon, vous pouvez mettre le SEQUENCE.nextval() l'expression dans la déclaration. Voir : https://www.jooq.org/doc/latest/manual/sql-execution/batch-execution/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X