天天看點

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

    * @param queryName 查詢條件的參數

    * @param firstResult 從第幾條資料開始查詢(分頁對象提供)

    * @param maxResult   每頁顯示的資料條數(分頁對象提供)

    * @return List<SysUser>   傳回指定頁碼的資料集合

    * @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)

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

}