取得查询的记录总数分页显示用的方法
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();
}
在一次项目中使用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();
}
相关文章推荐
- MySQL分页的同时查询记录总数 SQL_CALC_FOUND_ROWS的性能测试
- 毕业设计(二十一)---后台管理添加查询方法,按照xxx,升序/降序,每页显示X条记录
- 关于-NHibernate使用Criteria分页显示并返回记录总数
- SQL 分页查询语句大全即(查找第N到M条记录的方法)
- NHibernate使用Criteria分页显示并返回记录总数 【转】
- hibernate分组查询后,求分组总数的实现方法(管理系统分页)
- 数据查询分页显示的优化方法
- (转)NHibernate使用Criteria分页显示并返回记录总数
- oracle count 百万级 分页查询记录总数、总条数优化
- NHibernate使用Criteria分页显示并返回记录总数 【转】
- hibernate 多表联合查询,分页,重复记录导致的总记录数不对的解决方法。
- 关于-NHibernate使用Criteria分页显示并返回记录总数
- NHibernate使用Criteria分页显示并返回记录总数
- NHibernate使用Criteria分页显示并返回记录总数
- 使用存储过程查询并按每页10条记录分页显示图书借阅纪录
- [ssh]关于ssh中查询并分页方法的记录
- 毕业设计(二十一)---后台管理添加查询方法,按照xxx,升序/降序,每页显示X条记录
- MySql中,查询不重复记录的总数的方法
- Solr4:Solr查询结果JSP分页显示(每次查询只返回指定记录数)
- 使用Hibernate criteria进行分页查询时,如何实现一次查询取得总记录数和分页后结果集