sql >> Base de Datos >  >> RDS >> PostgreSQL

Manejo de BatchUpdateException usando withBatch

Pude resolver esto con la publicación mencionada en el comentario de Alexandros. La solución ahora se ve así:

sql.withTransaction {
    try {
        sql.withBatch(1000, 'insert into category (id, version, name, parent_id) ' +
        'select :id, :version, :name, :parent_id ' +
        'where not exists (select name, parent_id from category where name = :name and parent_id = :parent_id);') { stmt ->
            categoryInserts.each {
                try {
                    stmt.addBatch([id: it.id, version: 0, name: it.name, parent_id: it.parent?.id])
                } catch (SQLException e) {
                  log.error("Category ${it.name} with parent ${it.parent?.id} could not be inserted.")
                }
            }
        }
    } catch (BatchUpdateException e) {
        log.error("Categories could not be inserted.", e)
    }

    sql.commit()
}

Tenga en cuenta que esto se resuelve con el dialecto postgresql de SQL. Para otros DBMS, podría ser un enfoque útil usar un procedimiento SQL en el método withBatch.

Si alguien conoce una forma de hacer esto con un SQL estándar, por favor deme una pista.