Мне нужно обновить одно свойство для большого набора данных в базе данных Oracle с помощью grails 2.5
Сейчас мой код выглядит примерно так:
List booksToUpdate = []
boolean moreBooks = true
int offset = 0
while (moreBooks) {
def fetchedBooks = []
if('Europe'){
fetchedBooks = Book.findAllByAuthorInList(getEuropeanAuthors(),
[max: BATCHSIZE, offset: offset])
} else {
fetchedBooks = Book.findAllByAuthorInListAndPublishYear(getEnglishAuthors(), '1999',
[max: BATCHSIZE, offset: offset])
}
booksToUpdate.addAll(fetchedBooks)
moreBooks = fetchedBooks.size() == BATCHSIZE
offset += BATCHSIZE
}
booksToUpdate.each { book ->
book.copyright = '2020'
book.save(flush: true, failOnError: true)
}
Я бы хотел бы пакетировать мои обновления для производительности. Кроме того, запрос findAll отличается очень незначительно, и было бы неплохо построить критерии поиска условно. В идеале мне нужно что-то вроде этого:
while (moreBooks) {
def fetchedBooks = []
def criteria = new DetachedCriteria(Book)
criteria.build [max: BATCHSIZE, offset: offset] {
List relevantAuthors = []
if('Europe') {
relevantAuthors = getEuropeanAuthors()
eq 'publishYear', '1999'
} else {
relevantAuthors = getEnglishAuthors()
}
inList 'author', relevantAuthors
}
criteria.updateAll(copyright:'2020') //batch update
moreBooks = fetchedBooks.size() == BATCHSIZE
offset += BATCHSIZE
}
Есть способ сделать это? Не обязательно с DetachedCriteria. Я посмотрел на руководство , но ничего не могу найти о передаче max и offset. Есть ли лучший способ сделать код более элегантным без ущерба для его производительности?