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)
最新推荐文章于 2012-03-08 22:56:49 发布