`
mushme
  • 浏览: 790090 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

利用HibernateCallback() 回调查询的疑问

 
阅读更多
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 使用方法 HibernateCallback 是 Hibernate 框架中的一种 callback 机制,允许开发者在持久层访问时执行自定义操作。HibernateCallback 是 Spring 框架中与 Hibernate 整合的重要组件,通过它可以...

    Hibernate+Struts+Spring 实现的通用分页查询

    `queryPage`方法通过`HibernateCallback`回调机制,在Hibernate的Session中执行HQL查询,获取数据并填充到`PageModel`对象中。这样做的好处是将数据库操作与业务逻辑解耦,同时利用Spring的事务管理能力。 在实际...

    HbernateTemplate的使用.pdf

    开发者可以在实现`doInHibernate(Session session)`方法后,通过`HibernateTemplate.execute(HibernateCallback<T> action)`方法执行回调。 2. **命名SQL查询** 命名SQL查询允许预先在配置文件中定义SQL语句,然后...

    真是一个很好的分页例子

    `queryForPage`方法利用了Spring的`HibernateTemplate`,通过回调机制执行`HibernateCallback`,在回调的内部创建`Query`对象,设置分页参数`setFirstResult`和`setMaxResults`,然后执行查询并返回结果。...

    ssh分页

    这里使用了`HibernateCallback`,在回调方法中设置查询条件(`criteria.setProjection(Projections.rowCount()).uniqueResult()`用于获取总记录数),并根据分页参数获取当前页的数据。 通过这种方式,SSH框架实现...

    struts2+spring+hibernate分页显示完整代码

    `queryForPage` 方法通过`getHibernateTemplate().executeFind()`方法执行HQL查询,并利用`HibernateCallback`接口回调来设置查询的起始位置和最大结果数,从而实现分页。`getAllRowCount` 方法则直接返回HQL查询后...

    ssh分页实现.

    这里使用了`HibernateCallback`接口,它允许在回调方法中执行原生的Hibernate操作,如设置分页参数`setFirstResult`和`setMaxResults`。 ### 四、PageBean类设计 为了封装分页信息,可以创建一个`PageBean`类,它...

    Hibernate分页查询

    `queryForPage`方法通过`HibernateTemplate`的`executeFind`方法执行HQL查询并进行分页,利用`setFirstResult`设置起始索引(即偏移量),`setMaxResults`设置每页显示的记录数。而`getAllRowCount`方法则通过`find`...

    Struts+Spring+Hibernate之选课系统

    Spring还支持使用回调机制(如HibernateCallback)处理特殊查询和分页。 Hibernate的核心在于对象关系映射,它允许我们将Java对象直接映射到数据库表。开发者需要正确配置实体类(Entity)和数据访问对象(DAO),...

    getHibernateTemplate

    5. **回调机制**:当`getHibernateTemplate()`的标准方法无法满足特定需求时,可以使用`HibernateCallback`接口进行自定义操作。这允许你在Hibernate的Session内部执行任意操作,同时仍然享受到Spring提供的事务和...

    框架分页Dao

    在`queryForPage`方法中,我们利用`HibernateTemplate`的`executeFind`方法,通过回调接口`HibernateCallback`执行HQL查询,并设置分页参数`setFirstResult`和`setMaxResults`。这样,我们可以按需获取指定范围内的...

    MyEclipse的整合Struts+Spring+Hibernate简单例子开发

    - `UserDaoImpl`: 实现了`UserDao`接口,利用Spring的`HibernateDaoSupport`简化了与Hibernate的交互,通过`HibernateCallback`执行查询操作。 - `index.jsp`: 用户输入界面,可能包含一个表单,提交用户ID。 - `...

    shh整合框架实现分页

    - 使用`super.getHibernateTemplate().execute()`执行Hibernate回调函数,其中`HibernateCallback`接口定义了执行的具体逻辑。 - `setFirstResult((page - 1) * rowsPerPage)`设置查询起始位置。 - `...

    Struts2,hibernate,Spring分页方法

    在`MemberDaoImpl`实现类中,我们利用`HibernateTemplate`的`executeFind`方法,通过传入一个实现了`HibernateCallback`接口的匿名内部类来执行HQL查询,并设置分页参数。 2. `getAllRowCount`:此方法用于获取满足...

    HibernateSpringStruts2整合开发中的一个分页显示方案.doc

    在`queryForPage`方法中,我们使用了`HibernateCallback`接口回调,通过`getHibernateTemplate().executeFind()`执行HQL查询并设置分页参数`setFirstResult`和`setMaxResults`。`getAllRowCount`方法则直接返回HQL...

    Hibernate+Spring+Struts2整合开发中的一个分页显示方案参考.pdf

    在`queryForPage`方法中,通过`HibernateTemplate`的`executeFind`方法,我们可以传递一个`HibernateCallback`实例,该回调内部创建`Query`对象并设置分页参数`setFirstResult`和`setMaxResults`。`getAllRowCount`...

    HibernateS整合pring

    此外,`HibernateTemplate`还支持`HibernateCallback`接口,允许开发者在回调方法`doInHibernate(Session session)`中使用原生的Hibernate API,以应对更复杂的数据访问需求。这种方法确保了灵活性,即使在Spring的...

    Hibernate学习笔记,使用Hibernate做数据层非常方便

    通过`getHibernateTemplate().executeFind()`方法,我们创建了一个`HibernateCallback`回调,内部执行SQL查询。这里使用了HQL(Hibernate Query Language)编写查询语句,`"from ControlScreen order by id desc"`...

    SSH整合技术

    在实现分页查询时,需要注意的是,要在HibernateCallback的`doInHibernate`方法中编写HQL语句或Criteria查询,通过Session创建Query对象,然后设置分页参数(如`setFirstResult`和`setMaxResults`),最后执行查询。...

Global site tag (gtag.js) - Google Analytics