JSF分页查询方法(2)
二、获得记录总数
2.1 查询的目的
获得符合条件的记录.
获得符合条件的记录的总数.
2.2 Hibernate查询的实现
2.2.1 获得符合条件的记录.
以Hibernate查询作为例子, 我们对上层(服务层和Web层)提供了一个以上的获取数据记录列表的方法,
public List getOaTypealles() {
//返回包含所有对象的列表
}
public List getOaTypealles(OaTypeall oaTypeall) {
//返回长得跟oaTypeall相似的对象的列表, 如可以使用Hihernate的FindByExample方法
}
public List getOaTypealles(OaTypeAllQuery oaTypeallQuery) {
//返回符合查询条件的对象的列表
}
我们下面就详细解释getOaTypealles(OaTypeAllQuery oaTypeallQuery)方法.
所有的查询属性已经包含在oaTypeallQuery里面了,我们怎么去根据这些条件来做查询呢?
Hibernate提供了非常强大的Criteria [读音krai5tiEriE] 接口, 利用它可以很方便的实现查询.
----------------------------------------
//从DAO实现继承的基类获得session
Session session = this.getSession();
//获得查询OaTypeall的对象
Criteria criteria = session.createCriteria(OaTypeall.class);
//把查询对象oaTypeallQuery中不为空(null或者"")的属性加入查询条件中
if (oaTypeallQuery.getTypename()!=null && !oaTypeallQuery.getTypename().equals("")) {
criteria.add(Expression.like("oaTypeallPK.typename","%"+oaTypeallQuery.getTypename()+"%"));
}
if (oaTypeallQuery.getTypeparent()!=null && !oaTypeallQuery.getTypeparent().equals("")) {
criteria.add(Expression.eq("typeparent", oaTypeallQuery.getTypeparent()));
}
//...其他查询条件
//定位分页第一条记录
criteria.setFirstResult(oaTypeallQuery.getFirstResult());
//获得最多为一页大小的数目的记录
criteria.setMaxResults(oaTypeallQuery.getPageSize());
//把记录放在list列表中
List list = criteria.list();
----------------------------------------
2.2.2 获得符合条件的记录的总数.
那记录的总数呢? 是list.size()吗? 不是的, list.size()总是小于等于pageSize的.
难道要删除掉setFirstResult和setMaxResults方法,把所有符合条件的记录
都拿出来放到list再获得list的size吗? 当然不是, 我不管数据表的记录是多是少,都不太
赞成这种做法, 因为这是比较严重的影响服务器性能的做法.
Criteria再次显示了它强大的一面, 它提供了投影/聚合查询功能, 可以让我们执行一次count(*)
查询,就可以让数据库返回一个获得符合条件的记录的总数.
----------------------------------------
public int countOaTypealles(OaTypeAllQuery oaTypeallQuery) {
//...
Session session = this.getSession();
Criteria criteria = session.createCriteria(OaTypeall.class);
//投影/聚合, 只要求返回OaTypeall的count数目
criteria.setProjection(Projections.rowCount());
//prepareCriteria(criteria, oaTypeallQuery);
//获得count字段的值,放到ret中
Integer ret = (Integer)criteria.uniqueResult();
return ret.intValue();
}
----------------------------------------
最后执行
oaTypeallQuery.setRecordCount(this.countOaTypealles(oaTypeallQuery));
把总数赋予oaTypeallQuery对象即可.
JSF分页查询方法(2)
最新推荐文章于 2020-05-09 23:33:03 发布