Tôi đã có thể giải quyết điều này với bài đăng được đề cập trong bình luận của Alexandros. Giải pháp bây giờ trông giống như sau:
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()
}
Lưu ý rằng điều này được giải quyết bằng phương ngữ postgresql của SQL. Đối với các DBMS khác, có thể là một cách tiếp cận hữu ích để sử dụng thủ tục SQL trong phương thức withBatch-method.
Nếu ai đó biết cách thực hiện điều này với SQL chuẩn, vui lòng cho tôi một gợi ý.