zoukankan      html  css  js  c++  java
  • hibernate中带查询条件的分页

    所谓分页,从数据库中分,则是封装一个分页类。利用分页对象进行分页。

    但,分页往往带查询条件。

    分页类的三个重要数据:【当前页码数】,【数据库中的总记录数】,【每页显示的数据的条数】

    原理:select * from  【表名】 where   【字段名】  like   【'%条件%'】    limit  【开始查询的索引】,【每页显示的数据】

    带查询条件的分页分两步

             (1)第一步:查询出符合条件的数据的总条数 

                    ---->select count(*) from 【表名】 where  【字段名】 like 【条件】

             (2)第二步:提供三个重要数据,生成分页对象,然后查询数据库中指定页码的数据

                    ---->select * from  【表名】 where   【字段名】  like   【'%条件%'】    limit  【开始查询的索引】,【每页显示的数据】

    hibernate框架下的分页【带查询条件的分页核心源代码】

      (1)获取符合条件的的数据的总记录数的方法

      /**
         * 获取数据库中带查询条件的数据的记录数
        * @Title: countByName
        * @Description: TODO(这里用一句话描述这个方法的作用)
        * @param seachName 查询条件
        * @return
        * @return Integer    返回符合条件的数据的总记录数
        * @author 尚晓飞
        * @date 2014-7-1 上午9:22:14
         */
        public Integer countByName(final String seachName){
            return super.getHibernateTemplate().execute(new HibernateCallback<Integer>() {

                public Integer doInHibernate(Session session)
                        throws HibernateException, SQLException {
                        Query query=session.createSQLQuery("select count(*) from sys_user where  sys_user_name LIKE ?");
                            query.setParameter(0, "%"+seachName+"%");
                             Number number= (java.lang.Number) query.uniqueResult();
                             return number.intValue();

                }

                
            });
        }

    (2)跟据符合条件的数据总记录数,前台提供的当前页码数,每页显示的数据条数,生成分页对象

        //获取分页对象(当前页码数,符合条件的数据的总记录数,每页显示的数据条数)
                  this.page=new Page(num, countRecords, pageRecords);

    (3)根据分页对象,查询条件,利用hibernate框架进行分页(可以用sql语句分页,此处用hql分页,也是hibernate的分页)

      /**
         *
        * @Title: queryByQueryName
        * @Description: TODO(这里用一句话描述这个方法的作用)
        * @param queryName 查询条件的参数
        * @param firstResult 从第几条数据开始查询(分页对象提供)
        * @param maxResult   每页显示的数据条数(分页对象提供)
        * @return
        * @return List<SysUser>   返回指定页码的数据集合
        * @author 尚晓飞
        * @date 2014-7-1 下午5:02:07
         */
        @SuppressWarnings("unchecked")
        public List<SysUser> queryByQueryName( final String queryName,final Integer firstResult,final Integer maxResult){
            return (List<SysUser>)super.getHibernateTemplate().executeFind(new HibernateCallback<List<SysUser>>() {
                @Override
                public List<SysUser> doInHibernate(Session session)
                        throws HibernateException, SQLException {
                        Query query=session.createQuery("from SysUser where sysUserName like ?");//带查询条件的分页hql语句

                                query.setParameter(0,"%"+queryName+"%");
                                query.setFirstResult(firstResult);//从第几条数据开始查询
                                query.setMaxResults(maxResult);//每页显示多少条数据
                                return query.list();

                }
            });
        }

    (4)分页类【仅供参考,省去set,get方法,代码简单,思路重要】


    public class Page{
        //每页显示数据条数
        private int pageSize;
        //当前页码数
        private int pageNum;
        //数据库中总记录数
        private int rowCount;
        
        //总页数
        private int pageCount;
        //从多少条记录开始查询
        private int rowStart;
        
        //是否有上一页
        private boolean hasPrevious=false;
        //上一页
        private int previousPage;
        //首页
        private int firstPage;
        
        //是否有下一页
        private boolean hasNext=false;
        //下一页
        private int nextPage;
        //末尾页
        private int lastPage;
        
        //每页显示的页码数
        private int everyPageCount=10;
        //每页开始的页码数
        private int everyPageStart;
        //每页结束的页码数
        private int everyPageEnd;
        
        public Page(){}
        
        public Page(String pageSize, String pageNum, int rowCount) {
            this.pageSize=pageSize==null?10:Integer.parseInt(pageSize);
            this.pageNum=pageNum==null?1:Integer.parseInt(pageNum);
            this.rowCount=rowCount;
            
            
            
            //总页数
            this.pageCount=(int)Math.ceil(this.rowCount*1.0/this.pageSize);
            //当删除最后一页数据时,会造成pageNum>pageCount,所以赋值。
            if(this.pageNum>this.pageCount){
                this.pageNum=this.pageCount;
            }
            
            //每次从第几条记录开始查  select * from onesong limit rowStart ,pageSize
            this.rowCount=(this.pageNum-1)*this.pageSize;
            
            
            //当页码数大于1则存在上一页,和首页
            if(this.pageNum>1){
                this.hasPrevious=true;
                this.previousPage=this.pageNum-1;
                this.firstPage=1;
            }
            
            //当页码数小于1则存在下一页,和尾页
            if(this.pageNum<this.pageCount){
                this.hasNext=true;
                this.nextPage=this.pageNum+1;
                this.lastPage=this.pageCount;
            }
            
            
            //每页显示的页码数的开始和结束
            this.everyPageStart=(this.pageNum-this.pageSize/2)<=0?1:(this.pageNum-this.pageSize/2);
            this.everyPageEnd=(this.everyPageStart+this.everyPageCount-1)>=this.pageCount?pageCount:(this.everyPageStart+this.everyPageCount-1);
        }

    }

            

  • 相关阅读:
    一些业内有名的网站收集
    WCF重载
    FCKEditor fckconfig.js配置,添加字体和大小 附:中文字体乱码问题解决
    查询第几条到第几条的数据的SQL语句
    SPOJ 9939 Eliminate the Conflict
    UVA 10534 Wavio Sequence
    HDU 3474 Necklace
    POJ 2823 Sliding Window
    UVA 437 The Tower of Babylon
    UVA 825 Walking on the Safe Side
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/3818762.html
Copyright © 2011-2022 走看看