日期:2014-05-20  浏览次数:20707 次

关于使用Hibernate实现通用性分页功能的问题
1).在结合Spring时,在DAO层通过使用HibernatTemplate已经封装session的操作。如果在项目中仅仅使用Hibernate框架的话,那么在DAO层对每一个PO对象总是需要对Sesson进行open和close的操作。这样岂不是很会影响性能?请问,有没有什么方法可以改进?
2).关于使用Hibernate进行分页,能不能使用一个通用性的分页功能!这样就可以针对每一个PO对象进行相应的分页查询!!

------解决方案--------------------
1、每个session代表一个会话,比作一次连接,每次的open和close是保证事务的完整性

2、使用通用性分页是在你用session操作时,既然你与spring结合使用,大多数情况下我们会用spring提供的HibernateTemplate来操作,这时你使用什么setFirstResult会有些麻烦
------解决方案--------------------
个人认为1楼大哥说的不错
1.如果对Sesson不进行open和close的操作,那么容易将数据库连接池的资源耗尽,导致对数据库的操作失败。
2.同意一楼意见。
------解决方案--------------------
这是我经常 用的分页功能通用工具类(如果你不使用struts,就得手动的把pageResult对象放入request)

Java code

public class CommonDAOHibImpl extends HibernateDaoSupport implements CommonDAO {
    
    /**
     * 传一个hql语句过来,把结束存进pageResult
     */
    public void listByPage(String hql, PageResult pageResult) {
        if (null==hql || pageResult== null ){
            return ;
        }
        Query query = this.getSession().createQuery(hql);
        query.setFirstResult(pageResult.getFirstRec());
        query.setMaxResults(pageResult.getPageSize());
        List ret = query.list();
        pageResult.setList(ret);

        String queryString = "";
        if (hql.toUpperCase().indexOf("SELECT") != -1) {
            int i = query.getQueryString().toUpperCase().indexOf("FROM");
            queryString = "Select count(*) " + hql.substring(i,hql.length());
        } else {
            queryString = "Select count(*) " + hql;
        }
        // 去掉ORDER BY 的部分
        int j = queryString.toUpperCase().lastIndexOf("ORDER");
        if (j!=-1){
            queryString = queryString.substring(0, j);
        }        
        Query cquery = this.getSession().createQuery(queryString);
        cquery.setCacheable(true);
        int recTotal = ((Integer)cquery.iterate().next()).intValue();        
        pageResult.setRecTotal(recTotal);
    }
}

------解决方案--------------------
4楼的请问你用的是什么技术。hibernate?

public class CommonDAOHibImpl extends HibernateDaoSupport implements CommonDAO 

继承HibernateDaoSupport类有什么作用啊?CommonDAO接口是不是定义的listByPage(String hql, PageResult pageResult)方法啊?

query.setFirstResult(pageResult.getFirstRec());
query.setMaxResults(pageResult.getPageSize());
这两句是什么意思 啊?


Query cquery = this.getSession().createQuery(queryString);这个得到的是什么啊?
cquery.setCacheable(true);什么意思啊?
int recTotal = ((Integer)cquery.iterate().next()).intValue(); 什么意思啊?


FormBean myForm = (FormBean) form;
这句话是不是写错了啊?
应该是BaseForm myForm =new BaseForm();




------解决方案--------------------
自己感觉四楼代码非常好,重用性很高!不知道为什么五楼这样说,对他是否理解认真看待此贴对hibernate的理解感觉到怀疑!四楼的这段可以称得上是最优雅的代码!
------解决方案--------------------
探讨
1).在结合Spring时,在DAO层通过使用HibernatTemplate已经封装session的操作。如果在项目中仅仅使用Hibernate框架的话,那么在DAO层对每一个PO对象总是需要对Sesson进行open和close的操作。这样岂不是很会影响性能?请问,有没有什么方法可以改进?
2).关于使用Hibernate进行分页,能不能使用一个通用性的分页功能!这样就可以针对每一个PO对象进行相应的分页查询!!

------解决方案--------------------
用HibernateTemplate来操来处理吧,你不用自己管理session的open和close,如果光是分页查询也不用管理事物,HibernateTemplate提供了很多接口让你实现,只需要注入你的datasource就行啦
------解决方案--------------------
高效程序通用分页最小功能集合:{动态sql生成功能,环境上下文存储区,连接管理功能}

高效DB通用分页最小功能集合:{动态sql生成功能,数据字典功能,通用接口标识调用功能}
------解决方案--------------------