SpringのHibernateTemplateに定義されているメソッドは、Hibernateで実現可能なことの一部しか存在しません。HibernateTemplateに無い処理を実装したいときには、HibernateCallbackを使います。(getHibernateTemplate().getSessionFactory()することも出来ますが、それじゃあ。。。ね)
例えばAccountというエンティティがあり、それに対してユーザー認証(nameとpasswordが一致しているかどうか)を行う場合の記述は以下のような感じです。
package net.grandnature.example.invoice.dao.hibernate;import java.sql.SQLException;
import net.grandnature.example.invoice.dao.AccountDao;
import net.grandnature.example.invoice.entity.Account;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class AccountDaoImpl extends HibernateDaoSupport implements AccountDao {
public Account findAccount(final String name, final String password) {
HibernateCallback callback = new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Criteria criteria = session.createCriteria(Account.class);
criteria.add(Expression.eq("name", name));
criteria.add(Expression.eq("password", password));
return criteria.uniqueResult();
}
};
return (Account) getHibernateTemplate().execute(callback);
}
}
HibernateCallbackのメソッドdoInHibernateがコールバックされます。この例ではHibernateTemplateをそのまま使っても実現できますが、Listで返って来てしまうのでちょっと気持ち悪いですよね。