我们在有分页显示的需求下,求记录总数的方法:
在一次项目中使用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();
}