一括更新
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"となって怒られる。
・・・あれぇ?