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

getHibernateTemplate()分页问题
1。 我想用这种形式的 应该也可以达到分页效果
  不知道性能怎么样

return (List) getHibernateTemplate().find(
"from food where Cate=? and Category=? ",
new String[] { Cate ,Category}).subList(Start, end);
  这个不知道是不是将有所记录查找出来 然后再取 subList(Start, end);
  如果是这样那性能应该不高。

2。另一个是使用这种形式的
  final String hql = "from PublicMessageTable where publicMessageColumnId=? order by pubDate desc";
  List listTable = getHibernateTemplate().executeFind(new HibernateCallback() {
  public Object doInHibernate(Session session)
  throws HibernateException, SQLException {
  Query query = session.createQuery(hql);
  query.setInteger(0, publicMessageColumnId.intValue());
  query.setFirstResult(start);
  query.setMaxResults(length);
  List list = query.list();
  return list;
  }
  });
  return listTable;
}

不知道他们有什么区别, 请高人帮看看 谢谢
希望能详细的说一下 再次感谢各位i

------解决方案--------------------
mark 我使用第二种
------解决方案--------------------
使用第二种
------解决方案--------------------
习惯的第二种
------解决方案--------------------
使用第二种
------解决方案--------------------
第一种:每次翻页都要跑到后台执行一次,数据量多的话,用不了几次,服务器肯定挂掉。
还不如
return (List) getHibernateTemplate().find(
"from food where Cate=? and Category=? ",
new String[] { Cate ,Category})
一次取出所有结果,传到前台,使用前台分页(jquery或者其他技术),这样翻页也不会再跑到后台去执行查询,性能上会有很大提高,用户感觉也比较好。

第二种:正规传统做法。以下文章可参阅
http://www.javaeye.com/topic/261
------解决方案--------------------
第一种,直接和数据库操作,会在数据量大的时候,容易出现数据库拒绝连接的情况,性能和自己写JDBC没啥区别.

第二种,则优先从缓存中查找,这样不容易对数据库的连接数平凡递增,而且永远从内存中取数据是最快的...
------解决方案--------------------
能这样?
探讨
第一种:每次翻页都要跑到后台执行一次,数据量多的话,用不了几次,服务器肯定挂掉。
还不如
一次取出所有结果,传到前台,使用前台分页(jquery或者其他技术……

------解决方案--------------------
探讨
能这样?

引用:
第一种:每次翻页都要跑到后台执行一次,数据量多的话,用不了几次,服务器肯定挂掉。
还不如
一次取出所有结果,传到前台,使用前台分页(jquery或者其他技术……


我想知道,你的数据量多是有多少?
数据量少的时候一次性取出所有的结果还差不多。
数据多了,还一次拿出来。你自己去看看要多久时间,还用户体验好?
自己生成一些数……

------解决方案--------------------
使用第二种
------解决方案--------------------
推荐使用第二种,下面是它的三种可能:很实用的
Java code
public class PageHibernateDaoSupport extends HibernateDaoSupport {
    
    /**
     * 使用hql 语句进行分页查询操作
     * @param hql 需要查询的hql语句
     * @param offset 第一条记录索引
     * @param pageSize 每页需要显示的记录数
     * @return 当前页的所有记录
     */
    @SuppressWarnings("unchecked")
    public List findByPage(final String hql, 
         final int offset, final int pageSize)
    {

        List list = getHibernateTemplate().executeFind(new HibernateCallback()
            {
                public Object doInHibernate(Session session)
                    throws HibernateException, SQLException
                {
                    List result = session.createQuery(hql)
                                         .setFirstResult(offset)
                                         .setMaxResults(pageSize)
                                         .list();
                    return result;
                }
            });
        return list;
    }


    /**
     * 使用hql 语句进行分页查询操作
     * @param hql 需要查询的hql语句
     * @param value 如果hql有一个参数需要传入,value就是传入的参数
     * @param offset 第一条记录索引
     * @param pageSize 每页需要显示的记录数
     * @return 当前页的所有记录
     */
    @SuppressWarnings("unchecked")
    public List findByPage(final String hql , final Object value ,
         final int offset, final int pageSize)
    {

        List list = getHibernateTemplate().executeFind(new HibernateCallback()
            {
                public Object doInHibernate(Session session)
                    throws HibernateException, SQLException
                {
                    List result = session.createQuery(hql)
                                         .setParameter(0, value) 
                                         .setFirstResult(offset)
                                         .setMaxResults(pageSize)
                                         .list();
                    return result;
                }
            });
        return list;
    }


    /**
     * 使用hql 语句进行分页查询操作
     * @param hql 需要查询的hql语句
     * @param values 如果hql有多个个参数需要传入,values就是传入的参数数组
     * @param offset 第一条记录索引
     * @param pageSize 每页需要显示的记录数
     * @return 当前页的所有记录
     */
    @SuppressWarnings("unchecked")
    public List findByPage(final String hql, final Object[] values,
         final int offset, final int pageSize)
    {

        List list = getHibernateTemplate().executeFind(new HibernateCallback()
            {
                public Object doInHibernate(Session session)
                    throws HibernateException, SQLException
                {
                    Query query = session.createQuery(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;
    }
        
}