Hibernate+Spring,由于本身提供的方法可能不能满足我们的查询,尤其是Criteria 查询,因此Spring为我们预留了回调接口,
下面我们重新定制findAll(),HibernateTemplate给我们提供了executeFind方法和execute方法,executeFind 返回List方法,
execute方法返回Object,接收一个参数回调接口HibernateCallback的实现类,接口中有一个方法 doInHibernate,我们需要实现这个方法
public List findAll() {
return super.getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session s) throws
HibernateException {
Query c = s.createQuery("from Emp");
return c.list();
}
});
}
内部实现:
public Object execute(HibernateCallback action) throws DataAccessException {
return doExecute(action, false, false);
}
public List executeFind(HibernateCallback action) throws DataAccessException {
Object result = doExecute(action, false, false);
if (result != null && !(result instanceof List)) {
throw new InvalidDataAccessApiUsageException(
"Result object returned from HibernateCallback isn't a List: [" + result + "]");
}
return (List) result;
}
可以看到不管是execute方法还是executeFind方法 都调用了doExecute方法,获得Session后调用了我们实现的回调方法
Object doExecute(HibernateCallback action,...)
{
Session sessionToExpose =...//获得当前的Session或是创建新的Session
...
Object result = action.doInHibernate(sessionToExpose);//传递Session调用我们实现的方法
flushIfNecessary(session, existingTransaction);
return result;
}