Hibernate實現limit語句效果


Hibernate

hibernate實現limit效果

  • 由於hql語句內無法直接書寫limit語法,所以需要通過別的方式來達成這個效果
  • limit效果一般需要有兩個參數:開始位置start和查詢數量num。兩個參數都是final int型
  • 實現代碼如下:
try {
            //首先新建一個final型的hql語句
            final String hql="from xxb where xx="+xx+" order by xx asc ";
            //hibernate執行查找,參數為請求返回方法
            List<xx> xxList=getHibernateTemplate().executeFind(new HibernateCallback() {
                public Object doInHibernate(Session session){
                    //創建查找對象 ,設置起始位置以及查詢數量
                    Query query=session.createQuery(hql);
                    query.setFirstResult(start);
                    query.setMaxResults(num);
                    //轉換為list形式
                    return query.list();
                }
            });
            return xxList;
        }catch (RuntimeException e){
            throw  e;
        }
  • 對於實現過程中的兩個相關方法,截取其源碼貼在下方,也可以自行查看。
    • executeFind方法實現如下:
public List executeFind(HibernateCallback<?> action) throws DataAccessException { 
        Object result = this.doExecute(action, false, false);
        if (result != null && !(result instanceof List)) {
            throw new InvalidDataAccessApiUsageException("Result object returned from HibernateCallback isn't a List: [" + result + "]");
        } else {
            return (List)result;
        }
    }
  • doInHibernate方法實現如下:
    public List<T> doInHibernate(Session session) throws HibernateException, SQLException {
        Query query = session.createQuery(this.hql).setFirstResult(this.pageModel.getBeginIndex()).setMaxResults(this.pageModel.getPageSize());
        if (!CollectionUtil.listIsNull(this.params)) {
            for(int i = 0; i < this.params.size(); ++i) {
                Object obj = this.params.get(i);
                if (obj instanceof String) {
                    query.setString(i, (String)obj);
                } else if (obj instanceof Integer) {
                    query.setInteger(i, (Integer)obj);
                } else if (obj instanceof Date) {
                    query.setDate(i, (Date)obj);
                }
            }
        }

        List<T> list = query.list();
        String counthql = "select count(*) " + this.hql;
        Query countQuery = session.createQuery(counthql);
        if (!CollectionUtil.listIsNull(this.params)) {
            for(int i = 0; i < this.params.size(); ++i) {
                Object obj = this.params.get(i);
                if (obj instanceof String) {
                    countQuery.setString(i, (String)obj);
                } else if (obj instanceof Integer) {
                    countQuery.setInteger(i, (Integer)obj);
                } else if (obj instanceof Date) {
                    countQuery.setDate(i, (Date)obj);
                }
            }
        }

        List<Object> countList = countQuery.list();
        if (CollectionUtil.listIsNull(countList)) {
            this.pageModel.setTotalCount(0L);
        } else {
            this.pageModel.setTotalCount((Long)countList.get(0));
        }

        return list;
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM