`

HibernateCallback()(

阅读更多
HibernateTemplate提供了非常多的常用方法来完成数据库的基本操作,使得持久层访问摸板化,只要创建HibernateTemplate 实例后,注入一个SessionFactory的引用就可以了.无须手动创建sessionFactory,更加智能的管理Hibernate 的Session,没有大量的try/catch操作,
   void delete(Object entity)删除指定持久化实例
   deleteAll(Collection entities)删除集合内全部持久化实例
   find(String queryString)根据HQL查询字符串返回实例集合
   findByNamedQuery(Striing QueryName)根据命名查询返回实例集合
   Get(Class entityClass,Serializable id)割据主键加载特定持久化类的实例
   save(Object entity)保存实例
   saveOrUpdate(Object entity)根据实例状态,选择保存或者更新
   update(Object entity)更新实例的状态
   setMaxResults(int maxResults)设置分页大小

Hibernate的复杂用法HibernateCallback
HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。
HibernateTemplate的灵活访问方式是通过如下两个方法完成:

(1)Object execute(HibernateCallback action)
 
(2)List execute(HibernateCallback action)

这两个方法都需要一个HibernateCallback的实例,HibernateCallback实例可在任何有效的Hibernate数据访问中使用。
程序开发者通过HibernateCallback,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装Hibernate后灵活性不足的缺陷。
HibernateCallback是一个接口,该接口只有一个方法doInHibernate(org.hibernate.Session session),
该方法只有一个参数Session。通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,
方法doInHibernate的方法体就是Spring执行的持久化操作。


    @SuppressWarnings({ "unchecked", "rawtypes" })
    public List<T> findByCriteria(final Class<T> entityClass,final String propertyName,final boolean isAsc,final int firstResult,final int maxResults,final Criterion... criterions){
        List<T> list = (List<T>)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Criteria criteria = session.createCriteria(entityClass);
                //按属性条件查询
                for(Criterion criterion : criterions){
                    criteria.add(criterion);
                }
                //按某个属性排序
                if(null != propertyName){
                    if(isAsc){
                        criteria.addOrder(Order.asc(propertyName));//升序
                    }else{
                        criteria.addOrder(Order.desc(propertyName));
                    }
                }
                //用于分页查询
                if(maxResults != 0){
                    criteria.setFirstResult(firstResult);
                    criteria.setMaxResults(maxResults);
                }
                List<T> list = criteria.list();
                return list;
            }
        });
        return list;
    }
  
  
    @SuppressWarnings({ "unchecked", "rawtypes" })
public int findCountsByCriteria(final Class<T> entityClass,final Criterion... criterions){
            int totalCounts = (Integer)getHibernateTemplate().execute(new HibernateCallback(){

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Criteria criteria = session.createCriteria(entityClass);
                //按属性条件查询
                for(Criterion criterion : criterions){
                    criteria.add(criterion);
                }
                int totalCounts = criteria.list().size();
                return totalCounts;
            }
        });
        return totalCounts;
    }
  
         做分页:
public List findByPage(final String hql,
        final int offset, final int pageSize)
    {
        //通过一个HibernateCallback对象来执行查询
        List list = getHibernateTemplate()
            .executeFind(new HibernateCallback()
        {
            //实现HibernateCallback接口必须实现的方法
            public Object doInHibernate(Session session)
                throws HibernateException, SQLException
            {
                //执行Hibernate分页查询
                List result = session.createQuery(hql)
                    .setFirstResult(offset)
                    .setMaxResults(pageSize)
                    .list();
                return result;
            }
        });
        return list;
    }

  
    public List findByPage(final String hql , final Object value ,
        final int offset, final int pageSize)
    {
        //通过一个HibernateCallback对象来执行查询
        List list = getHibernateTemplate()
            .executeFind(new HibernateCallback()
        {
            //实现HibernateCallback接口必须实现的方法
            public Object doInHibernate(Session session)
                throws HibernateException, SQLException
            {
                //执行Hibernate分页查询
                List result = session.createQuery(hql)
                    //为hql语句传入参数
                    .setParameter(0, value)
                    .setFirstResult(offset)
                    .setMaxResults(pageSize)
                    .list();
                return result;
            }
        });
        return list;
    }

  
    public List findByPage(final String hql, final Object[] values,
        final int offset, final int pageSize)
    {
        //通过一个HibernateCallback对象来执行查询
        List list = getHibernateTemplate()
            .executeFind(new HibernateCallback()
        {
            //实现HibernateCallback接口必须实现的方法
            public Object doInHibernate(Session session)
                throws HibernateException, SQLException
            {
                //执行Hibernate分页查询
                Query query = session.createQuery(hql);
                //为hql语句传入参数
                for (int i = 0 ; i < values.length ; i++)
                {
                    query.setParameter( i, values[i]);
                }
                List result = query.setFirstResult(offset)
                    .setMaxResults(pageSize)
                    .list();
                return result;
            }
        });
        return list;
    }
}

分享到:
评论

相关推荐

    HibernateCallback使用方法

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

    第24次课-1 Spring与Hibernate的整合

    通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,方法doInHibernate()就是Spring执行的持久化操作。 24.3 Spring对Hibernate的简化 24.3.5 HibernateDaoSupport Spring为与...

    hibernate执行原生sql语句

    在上面的代码中,我们使用 `HibernateCallback` 接口来执行原生 SQL 语句,该接口提供了一个 `doInHibernate()` 方法,该方法将在 Hibernate 事务中执行。我们可以在该方法中执行原生 SQL 语句,并使用 `Connection`...

    HbernateTemplate的使用.pdf

    HibernateTemplate还提供了诸如`executeFind(HibernateCallback)`用于执行带参数的HQL查询,`update(String sql, Object[] args)`用于执行SQL更新语句等功能,以及对事务处理的支持。 综上,HibernateTemplate是...

    getHibernateTemplate

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

    ssh分页实现.

    SSH框架下的分页实现不仅需要在DAO层合理设计查询方法,还应充分利用Spring和Hibernate的特性,如`HibernateDaoSupport`和`HibernateCallback`,同时引入专门的`PageBean`类来管理分页状态。这种设计模式不仅提高了...

    SSH整合技术

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

    spring+hibernate详解

    本文详细介绍了Spring与Hibernate集成的过程,包括如何配置`SessionFactory`、使用`HibernateTemplate`简化数据操作、通过`HibernateDaoSupport`提高代码可维护性以及利用`HibernateCallback`实现更复杂的业务逻辑。...

    SSH整合文档

    3. **使用HibernateCallback**: HibernateCallback是一个接口,可以在Session中执行回调方法,例如查询数据。 ```java HibernateCallback&lt;List&lt;Dept&gt;&gt; callback = new HibernateCallback&lt;List&lt;Dept&gt;&gt;() { @...

    Spring整合hibernate

    它通过回调机制(HibernateCallback)对Hibernate的操作进行封装,使开发者能够以一种更面向对象的方式处理数据库交互。例如,你可以通过实现HibernateCallback接口的doInHibernate方法,传入一个回调函数,执行特定...

    Spring整合Hibernate 详解.doc

    Spring通过提供一系列的DAO抽象类,如HibernateDaoSupport,HibernateTemplate以及HibernateCallBack,使得开发者可以更方便地实现DAO组件。这些抽象类作为DAO实现类的基类,降低了开发难度,确保了代码的一致性和可...

    新闻发布系统

    return template.execute(new HibernateCallback&lt;List&lt;News&gt;&gt;() { public List&lt;News&gt; doInHibernate(Session session) throws HibernateException,SQLException { List&lt;News&gt; list = null; Query query...

    HibernateTemplate类的使用

    `HibernateCallback`是一个功能性接口,包含一个方法`doInHibernate`,开发者可以在该方法中编写具体的Hibernate操作逻辑。当`HibernateTemplate`执行`execute`方法时,它会在内部创建或获取一个`Session`,并调用`...

    HibernateTemplate源代码

    `HibernateTemplate`通过其核心方法`execute`支持Hibernate访问代码的实现,该方法接受一个实现了`HibernateCallback`接口的匿名内部类或Lambda表达式。 #### 二、类结构与继承关系 `HibernateTemplate`类本身并...

    HibernateTemplate汇总

    executeFind 方法用于执行给定的 HibernateCallback 对象,用于在 Session 中执行查询操作。 HibernateTemplate 提供了许多实用的方法来简化 Hibernate 的使用,提高了数据库操作的效率和简洁性。本文对 ...

    ssh实例 集成 例子

    return getHibernateTemplate().execute(new HibernateCallback&lt;List&lt;String&gt;&gt;() { @Override public List&lt;String&gt; doInHibernate(Session session) throws HibernateException, SQLException { Query query = ...

    SSH2分页算法的实现

    `queryForPage`方法则利用`executeFind`方法执行自定义的HibernateCallback,通过设置`setFirstResult`和`setMaxResults`来实现分页。 #### 四、分页信息管理 为了更好地管理和展示分页信息,通常会创建一个专门的...

    Spring对DAO的支持.doc

    Spring通过HibernateTemplate和HibernateCallback接口,提供了对Hibernate ORM框架的集成。这使得开发者可以在不直接操作Session的前提下,方便地进行持久化操作。HibernateTemplate自动处理事务管理和资源关闭,...

    HibernateS整合pring

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

Global site tag (gtag.js) - Google Analytics