您的位置:首页 > 编程语言 > Java开发

取得查询的记录总数分页显示用的方法

2006-07-12 09:31 513 查看
我们在有分页显示的需求下,求记录总数的方法:

在一次项目中使用struts+hibernate+spring;有一个模块需要使用group by分组查询能直接得出结果,然后在页面显示分页的效果,就根据查询条件构造sql语句如下:
select a.credno,sum(a.debit) from BalanCredencePO as a group by a.credno order by a.credno。
 调用底层类hibernateDataSource.get(strSql,pageListData);查询的结果正确,但分页的footer显示有问题,查询的记录数显示不对。
调试,调试,调试,找到HibernateDataSource的getTotalCount方法

 /**
   * 取得查询的记录总数(分页显示用)
   *
   * @param session Hibernate的Session对象
   * @param hql 查询语句
   * @return int 查询的记录总数
   * @throws DataAccessException 处理失败时抛出该异常
   */
  private int getTotalCount(Session session,String hql) throws DataAccessException {
    Integer amount = new Integer(0);
    int sqlFrom = hql.indexOf("from");
    int sqlOrderby = hql.indexOf("order by");
    String countStr = "";
    //因为此方法只取得查询的结果总数,所以将查询语句中可能存在的排序语句去掉来提高查询效率
    if(sqlOrderby > 0) {
      countStr = "select count(*) " + hql.substring(sqlFrom,sqlOrderby);
    } else {
      countStr = "select count(*) " + hql.substring(sqlFrom);
    }
    Query qry = null;
    try {
      qry = session.createQuery(countStr);
     
      if(!qry.list().isEmpty()) {
        amount = (Integer)qry.list().get(0);
      } else {
        return 0;
      }
    } catch(HibernateException ex) {
      throw new DataAccessException(ex);
    }finally{
     session.clear();
    }
    return amount.intValue();
  }

取得查询的记录总数的时候只get(0),amount = (Integer) qry.list().get(0); 如果是分组查询这里的get(0)只是获得分组查询后,记录的第一个分组内的记录数;如果没有group分组,那取的记录就一个也就没问题。改造函数加上对group的判断分支。当有group的时候取count(count(*)) 作为记录条数

/**
  * 取得查询的记录总数(分页显示用)
  *
  * @param session
  *            Hibernate的Session对象
  * @param hql
  *            查询语句
  * @return int 查询的记录总数
  * @throws DataAccessException
  *             处理失败时抛出该异常
  */
 private int getTotalCount(Session session, String hql)
   throws DataAccessException {
  Integer amount = new Integer(0);
  int sqlFrom = hql.indexOf("from");
  int sqlGroupby = hql.indexOf("group");
  int sqlOrderby = hql.indexOf("order by");
  String countStr = "";
  //因为此方法只取得查询的结果总数,所以将查询语句中可能存在的排序语句去掉来提高查询效率
  if (sqlGroupby > 0) {
   countStr = "select count(count(*)) " + hql.substring(sqlFrom, sqlOrderby);
  } else if (sqlOrderby > 0) {
   countStr = "select count(*) "
     + hql.substring(sqlFrom, sqlOrderby);
  } else {
   countStr = "select count(*) " + hql.substring(sqlFrom);
  }
  Query qry = null;
  try {
   qry = session.createQuery(countStr);
   if (!qry.list().isEmpty()) {
    amount = (Integer) qry.list().get(0);
   } else {
    return 0;
   }
  } catch (HibernateException ex) {
   throw new DataAccessException(ex);
  } finally {
   session.clear();
  }
  return amount.intValue();
 } 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息