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);
        }

    }

            

  • 相关阅读:
    JavaSript数组扁平化去重
    宝塔面板忘记登陆账号和密码怎么办
    宝塔shell脚本执行thinkphp命令行
    laravel设置中国时区
    Laravel-admin左侧菜单栏怎么默认展开打开
    install.sh: 115: install.sh: Syntax error: "(" unexpected (expecting "}")
    git生成密钥
    git 忽略提交某个指定的文件(不从版本库中删除)
    larael-admin汉化配置中文
    Nginx PHP-Fcgi中因PHP执行时间导致504无限循环中断
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/3818762.html
Copyright © 2011-2022 走看看