मैं इसे अलेक्जेंड्रोस टिप्पणी में उल्लिखित पोस्ट के साथ हल करने में सक्षम था। समाधान अब इस तरह दिखता है:
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()
}
ध्यान रखें कि यह SQL की postgresql बोली के साथ हल किया गया है। अन्य DBMS के लिए withBatch-विधि में SQL-प्रक्रिया का उपयोग करना एक उपयोगी तरीका हो सकता है।
अगर किसी को मानक-एसक्यूएल के साथ ऐसा करने का तरीका पता है, तो कृपया मुझे एक संकेत दें।