一括更新

O/Rで一括更新などするのは邪道・・・というのはともかく、メンテ機能など作ろうとするとどうしても必要にはなる。


Hibernate3系ならばHQLを利用して一括更新するのが手っ取り早いかもしれない。
オリジナルはここ

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName";
// or String hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate )
        .setString( "newName", newName )
        .setString( "oldName", oldName )
        .executeUpdate();
tx.commit();
session.close();


HibernateTemplateを使うなら、以前利用した無名クラスを使う。

//HQL定義
final String hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName";

//無名クラス用パラメータ
final String newName = "NEW_NAME";
final String oldName = "OLD_NAME";

int updatedEntities =
  (Integer) getHibernateTemplate().execute(new HibernateCallback() {
  public Object doInHibernate(Session session) throws HibernateException {
    return session
                .createQuery(hqlUpdate)
                .setString("newName",newName)
                .setString("oldName",oldName)
                .executeUpdate();
  }
});


パフォーマンスやらトランザクションやらは別途調べる必要はあるかも。
ところで、エイリアスが使えるようなことが書いてあるが、expected "set" but found "c"となって怒られる。
・・・あれぇ?