public long getMaxMailId() {
long maxId = 0l;
maxId = ((Long) (this.getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(org.hibernate.Session session)
throws HibernateException, SQLException {
String sql = "select max(id) from Mail";
Query query = session.createQuery(sql);
return query.list();
}
}).get(0))).longValue();
return maxId;
}
为什么不直接用: this.getSession().createQuery(sql); 来查询呢?
我们使用HibernateTemplate,有一个很重要的原因就在于我们不想直接控制事务,不想直接去获取,打开Session,开始一个事务,处理异常,提交一个事务,最后关闭一个Session。我们自己只专注于业务,不想去作这些重复而繁琐的操作。我们把这些责任全部委托给了HibernateTemplate,然后使用声明式的配置来实现这样的功能。
如果我们通过类似getSession()这样的方法获得了Session,那就意味着我们放弃了上面所说的一切好处。所以,如果楼主的业务类如果在使用HibernateTemplate的同时,又可以直接得到Session(而不是通过HibernateCallback),那么我敢说楼主的代码一定有bug
你当然可以直接使用Query。但是问题是HibernateTemplate提供了相当多有用的辅助功能。我们想用它提供的辅助功能。但是HibernateTemplate包装了Hibernate的代码,使用了它以后不能直接访问到Session了,也就是说,我们无法通过Session对象得到Query了。所以,这种情况下我们当然无法直接用Query来查询了。
HibernateTemplate提供这个HibernateCallback,就是为了满足这种使用了HibernateTemplate的情况下,仍然需要直接访问Session的需求而来的。它提供了在HibernateTemplate里面直接访问Session的能力。
这个就是我们要使用HibernateCallback的原因。
最后提醒一下楼主,HibernateCallback是一个对象,而不是一个方法...
源地址:http://hi.baidu.com/yxl1982/blog/item/fc8a0a08cbf275d762d9869b.html
其它参考:http://hi.baidu.com/xiaosa1984/blog/item/daae690afa29781394ca6b6b.html
分享到:
相关推荐
HibernateCallback 使用方法 HibernateCallback 是 Hibernate 框架中的一种 callback 机制,允许开发者在持久层访问时执行自定义操作。HibernateCallback 是 Spring 框架中与 Hibernate 整合的重要组件,通过它可以...
`queryPage`方法通过`HibernateCallback`回调机制,在Hibernate的Session中执行HQL查询,获取数据并填充到`PageModel`对象中。这样做的好处是将数据库操作与业务逻辑解耦,同时利用Spring的事务管理能力。 在实际...
开发者可以在实现`doInHibernate(Session session)`方法后,通过`HibernateTemplate.execute(HibernateCallback<T> action)`方法执行回调。 2. **命名SQL查询** 命名SQL查询允许预先在配置文件中定义SQL语句,然后...
`queryForPage`方法利用了Spring的`HibernateTemplate`,通过回调机制执行`HibernateCallback`,在回调的内部创建`Query`对象,设置分页参数`setFirstResult`和`setMaxResults`,然后执行查询并返回结果。...
这里使用了`HibernateCallback`,在回调方法中设置查询条件(`criteria.setProjection(Projections.rowCount()).uniqueResult()`用于获取总记录数),并根据分页参数获取当前页的数据。 通过这种方式,SSH框架实现...
`queryForPage` 方法通过`getHibernateTemplate().executeFind()`方法执行HQL查询,并利用`HibernateCallback`接口回调来设置查询的起始位置和最大结果数,从而实现分页。`getAllRowCount` 方法则直接返回HQL查询后...
这里使用了`HibernateCallback`接口,它允许在回调方法中执行原生的Hibernate操作,如设置分页参数`setFirstResult`和`setMaxResults`。 ### 四、PageBean类设计 为了封装分页信息,可以创建一个`PageBean`类,它...
`queryForPage`方法通过`HibernateTemplate`的`executeFind`方法执行HQL查询并进行分页,利用`setFirstResult`设置起始索引(即偏移量),`setMaxResults`设置每页显示的记录数。而`getAllRowCount`方法则通过`find`...
Spring还支持使用回调机制(如HibernateCallback)处理特殊查询和分页。 Hibernate的核心在于对象关系映射,它允许我们将Java对象直接映射到数据库表。开发者需要正确配置实体类(Entity)和数据访问对象(DAO),...
5. **回调机制**:当`getHibernateTemplate()`的标准方法无法满足特定需求时,可以使用`HibernateCallback`接口进行自定义操作。这允许你在Hibernate的Session内部执行任意操作,同时仍然享受到Spring提供的事务和...
在`queryForPage`方法中,我们利用`HibernateTemplate`的`executeFind`方法,通过回调接口`HibernateCallback`执行HQL查询,并设置分页参数`setFirstResult`和`setMaxResults`。这样,我们可以按需获取指定范围内的...
- `UserDaoImpl`: 实现了`UserDao`接口,利用Spring的`HibernateDaoSupport`简化了与Hibernate的交互,通过`HibernateCallback`执行查询操作。 - `index.jsp`: 用户输入界面,可能包含一个表单,提交用户ID。 - `...
- 使用`super.getHibernateTemplate().execute()`执行Hibernate回调函数,其中`HibernateCallback`接口定义了执行的具体逻辑。 - `setFirstResult((page - 1) * rowsPerPage)`设置查询起始位置。 - `...
在`MemberDaoImpl`实现类中,我们利用`HibernateTemplate`的`executeFind`方法,通过传入一个实现了`HibernateCallback`接口的匿名内部类来执行HQL查询,并设置分页参数。 2. `getAllRowCount`:此方法用于获取满足...
在`queryForPage`方法中,我们使用了`HibernateCallback`接口回调,通过`getHibernateTemplate().executeFind()`执行HQL查询并设置分页参数`setFirstResult`和`setMaxResults`。`getAllRowCount`方法则直接返回HQL...
在`queryForPage`方法中,通过`HibernateTemplate`的`executeFind`方法,我们可以传递一个`HibernateCallback`实例,该回调内部创建`Query`对象并设置分页参数`setFirstResult`和`setMaxResults`。`getAllRowCount`...
此外,`HibernateTemplate`还支持`HibernateCallback`接口,允许开发者在回调方法`doInHibernate(Session session)`中使用原生的Hibernate API,以应对更复杂的数据访问需求。这种方法确保了灵活性,即使在Spring的...
通过`getHibernateTemplate().executeFind()`方法,我们创建了一个`HibernateCallback`回调,内部执行SQL查询。这里使用了HQL(Hibernate Query Language)编写查询语句,`"from ControlScreen order by id desc"`...
在实现分页查询时,需要注意的是,要在HibernateCallback的`doInHibernate`方法中编写HQL语句或Criteria查询,通过Session创建Query对象,然后设置分页参数(如`setFirstResult`和`setMaxResults`),最后执行查询。...