PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Manipulando BatchUpdateException usando withBatch


Consegui resolver isso com o post mencionado no comentário de Alexandros. A solução agora fica assim:
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()
}

Esteja ciente de que isso é resolvido com o dialeto postgresql do SQL. Para outros DBMSs, pode ser uma abordagem útil usar um procedimento SQL no método withBatch.

Se alguém souber uma maneira de fazer isso com um SQL padrão, por favor me dê uma dica.