最近在整合ssh的时候刚好做到分页。自己在dao层一直是使用HibernateTemplate,但是在分页的时候需要设置offset和pagesize这两个参数。但是就hibernatetemplate中并没有能设置offset的方法(本人菜鸟初学)。
所有的刚开始的方法是int totalPages = ((Long) this.hibernateTemplate.getSessionFactory().openSession().createQuery(totalCountHql).uniqueResult()).intValue()得到总共的记录数,用List<Orgnization> date = (List<Orgnization>)this.hibernateTemplate.getSessionFactory().openSession().createQuery(totalHql).setFirstResult(offset).setMaxResults(pagesize).list();得到集合。然后再进行展现。
在调试的过程中程序正常运行三次后就不再一直在加载的页面不在运行。在论坛上发了帖子,又百度又谷歌都没有得到答案,有个答案说的很有道理但是我由于初学看的不是很懂。
后来也想尝试用HibernateDaoSupport来实现分页,我的第一反应是能不能同时使用着两种方法来管理dao层,但是Google后发现在注入的时候两个的class就是不一样的,让我马上打消了这个念头。
再仔细的看代码在想是不是能优化,发现原来是我在上述方法中一直在打开session却没有关闭。后来想到是不是能关闭session来解决问题,由于session一直在用在就在分页的封装中事先定义Session session =this.hibernateTemplate.getSessionFactory().openSession();在每次使用完session的时候及时关闭,经过调试程序能正常运行,也不会出现之前的情况了。
//事先要将hibernatetemplate注入
public PagerModel listOrgnization(int parentId, int offset, int pagesize) {
Session session = this.hibernateTemplate.getSessionFactory().openSession();
String totalCountHql = "select count(*) from Orgnization o where o.parent is null";
if(parentId != 0) {
totalCountHql = "select count(*) from Orgnization o where o.parent.id =" + parentId;
}
int totalPages = ((Long) session.createQuery(totalCountHql).uniqueResult()).intValue();
String totalHql = "from Orgnization o where o.parent.id is null";
if(parentId != 0) {
totalHql = "from Orgnization o where o.parent.id =" + parentId;
}
//使用hql的时候不能使用类的方法
List<Orgnization> date = (List<Orgnization>)session.createQuery(totalHql)
.setFirstResult(offset).setMaxResults(pagesize).list();
session.close();
PagerModel pm = new PagerModel();
pm.setDate(date);
pm.setTotalPage(totalPages);
return pm;