четверг, 31 мая 2012 г.

Batch updates в Grails с использованием HQL

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, что позволяет не загружать память при больших запросах.