使用 HibernateTemplate 实现分页查询 (HibernateCallback接口)

来源:互联网 发布:ipad看淘宝不能横屏 编辑:程序博客网 时间:2024/03/29 05:57

        HibernateTemplate 只支持 .setMaxResults(int) 方法。
        因此,做 Spring+Hibernate 分页处理要使用到一个接口 org.springframework.orm.hibernate3.HibernateCallback
来灵活操作数据库,该接口中有一个未实现的方法 Object doInHibernate (Session session),用以获得并利用 session 进行操作(自动创建、销毁)。

以下代码均参考了 使用 HibernateTemplate 实现分页查询 一文。

/**
 * 
 
*/

package springdao;

import hibernatedao.HibernateSessionFactory;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;



/**
 * 通用 DAO 包
 * 
@author kiant
 * 
@version Sep 7, 2008
 
*/

public class CommomsDAO {
    
private static final Log log = LogFactory.getLog(EcOpusDAO.class);
    
//获得会话
    private static HibernateTemplate hibernateTemplate = new HibernateTemplate(HibernateSessionFactory.getSessionFactory());
    
    
    
/**
     * 分页通用方法
     * 
@param hql  HQL查询语句
     * 
@param offset    起始记录下标
     * 
@param lengh        读取记录数
     * 
@return            List 结果集
     
*/

    
public static List getListForPage(final String hql, final int offset, final int lengh) {
        log.debug(
"finding ListForPage");
        
try {
            List list 
= hibernateTemplate.executeFind(new HibernateCallback(){

                
public Object doInHibernate(Session session)
                        
throws HibernateException, SQLException {
                    List list2 
= session.createQuery(hql)
                            .setFirstResult(offset)
                            .setMaxResults(lengh)
                            .list();                    
                    
return list2;
                }
}
);
            
return list;
        }
 catch (RuntimeException re) {
            log.error(
"find ListForPage failed", re);
            
throw re;
        }

    }

}



ps.
也可以通过:
        this.getSession();
        this.getHibernateTemplate().getSessionFactory().openSession();
分别获取 session 进行 createQuery()等操作。
但是这种做法,需要自己去手动关闭session的。所以你需要配置openSessioninview,不推荐使用!