ScrollableResults scroll = getSession()
.createQuery("SELECT DISTINCT t FROM ${tableName} as t LEFT JOIN t.tags as tags WHERE tags.id in (:tags)")
.setParameterList("tags", [oldTag1.id, oldTag2.id])
.scroll(ScrollMode.FORWARD_ONLY)
int count = 0;
while (scroll.next()) {
def exp = scroll.get(0)
exp.tags.remove(oldTag1)
exp.tags.remove(oldTag2)
exp.tags.add(newTag)
exp.save()
if (++count % 20 == 0)
{
session.flush();
session.clear();
}
}
Для работы данного когда надо получить CurrentSession из SessionFactory.
Данный код выполняет HQL запрос и когда число строк обработанных в результате запроса без остатка делится на 20 то сессия хибернейта выполняет flush и clean, что позволяет не загружать память при больших запросах.