一法:
String sql = "select * from GoodsMessage g where g.gType="+"'"+gtype+"'"+" limit "+((curPage-1)*pageSize)+","+pageSize+"";
list = (List<GoodsMessage>)sessionFactory.openSession().createSQLQuery(sql).addEntity(GoodsMessage.class).list();
二法:
String sql = "from GoodsMessage g where g.gType="+"'"+gtype+"'";
list = (List<GoodsMessage>)sessionFactory.openSession().createQuery(sql).setFirstResult((curPage-1)*pageSize).setMaxResults(pageSize).list();
三法:
final String sql = "from GoodsMessage g where g.gType="+"'"+gtype+"'";
return (List<GoodsMessage>)this.getHibernateTemplate().execute(new HibernateCallback() {

public Object doInHibernate(Session session) throws HibernateException,
SQLException {
Query query = session.createQuery(sql);
int beignRow = (curPage-1)*pageSize;
query.setFirstResult(beignRow);
query.setMaxResults(pageSize);
return query.list();
}
});为什么之前用前两种方法试,每次都是不报错,但每次启动tomcat之后只能进行五次查询,然后就页面缓冲不过来了,需要重启tomcat,然后又只能进行五次查询,感觉像是内存泄漏,但加大内存后,还是之前那样。用了第三种方法后,一切正常了。求大侠指点一下,这是什么原因?javaEE hibernate 分页

解决方案 »

  1.   

    你的问题出现在sessionFactory.openSession()这里。
      

  2.   

    session不是轻量级的吗?难道要用currentSession?
      

  3.   

    hibernate 分页推荐使用第三种方法
      

  4.   

    大神就是大神,改成getCurrentSession()问题解决。我数据也不多,这差距也太大了!
      

  5.   

    题外话:
    第一种分页方法限制了数据库方言,貌似适合mysql。
    第二种和第三种使用hibernate封装的方法,适合大多数数据库的,建议采用后两种方法
      

  6.   

    第二种方法比较常用。在hibernate中,没有必要自己写分页的SQL语句。
      

  7.   

    在一个应用程序中,如果DAO 层使用Spring 的hibernate 模板,通过Spring 来控制session 的生命周期,则首选getCurrentSession ()。
    是这样吗?
      

  8.   

    opensSession永远新建一个session。getCurrentSession是从context中找,有就用没有create