<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ice world

    There is nothing too difficult if you put your heart into it.
    posts - 104, comments - 103, trackbacks - 0, articles - 0

    Hibernate Criteria分頁產(chǎn)生的問題

    Posted on 2011-04-16 02:26 IceWee 閱讀(911) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate
    大家都知道做分頁必須要知道總記錄數(shù),這就為我們出了一到小題兒,往往我們直接用Criteria調(diào)用list方法就返回全部查詢結(jié)果了,但是分頁必須在返回列表之前得到總行數(shù)。我之前的做法是寫兩個(gè)方法,參數(shù)完全一樣,一個(gè)返回 Integer,也就是記錄數(shù),一個(gè)返回List,結(jié)果集。這樣寫感覺挺麻煩的,還有人直接用criteria.list()返回記錄數(shù),再設(shè)置分頁屬性,那樣還叫什么分頁啊,調(diào)用list已經(jīng)將數(shù)據(jù)加載到內(nèi)存了,那不又成了內(nèi)存分頁,這種做法程序處理簡(jiǎn)單了,性能降下來了。

    今天在網(wǎng)上閑逛發(fā)現(xiàn)了一個(gè)新招,代碼如下(只貼出回調(diào)函數(shù)里的代碼了):

    灰色斜體為業(yè)務(wù)相關(guān)代碼,請(qǐng)無視

    public Object doInHibernate(Session session) throws HibernateException, SQLException {
        Criteria criteria = session.createCriteria(XtLog.class);
        Criteria userCriteria = criteria.createCriteria("xtUser");
        Criteria lcCriteria = criteria.createCriteria("xtLogClass");
        if (StringUtils.isNotBlank(userId)) {
         userCriteria.add(Restrictions.like("userId", userId, MatchMode.START));
        }
        if (StringUtils.isNotBlank(logClassId)) {
         lcCriteria.add(Restrictions.eq("logClassId", logClassId));
        }
        if (beginDate != null && endDate != null) {
         criteria.add(Restrictions.between("xtOplogtime", beginDate, endDate));
        }

        int totalRows =((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
        psm.setTotalRows(totalRows);  // 業(yè)務(wù)代碼,請(qǐng)無視
        criteria.setProjection(null);
        criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
        Map<String, String> orderMap = psm.getOrderMap();
        if(orderMap != null){
         setOrder(criteria, userCriteria, lcCriteria, orderMap);
        }

        if(!psm.isAll()){  // 分頁
         criteria.setFirstResult(psm.getRowStart());
         criteria.setMaxResults(psm.getPageSize());
        }
    //    List<XtLog> logs = new ArrayList<XtLog>(); // 返回日志列表
    //    List<Object[]> list = criteria.list();
    //    for (Object[] o : list) {
    //     logs.add((XtLog) o[2]);
    //    }
    //    return logs;
        return criteria.list();
    }

    請(qǐng)注意綠色加粗那兩行代碼,那就是hibernate獲取記錄總行數(shù)的寫法,直接和獲取列表的方法寫在一起,貌似很簡(jiǎn)潔,很給力,如果你查詢的就是一張表,那么沒事了,但我查詢的日志是要關(guān)聯(lián)到用戶和日志分類的,最上面那三行代碼就是關(guān)聯(lián)了,這時(shí)發(fā)現(xiàn)返回到頁面后報(bào)錯(cuò)了,原因是返回的并不是我要的日志List,而是 Object[]的List,每個(gè)List里三個(gè)對(duì)象數(shù)組,主表的數(shù)組下標(biāo)是最后一個(gè),這時(shí)我就得使用藍(lán)色字體的代碼重新封裝后返回,我感覺這樣雖然解決了該問題,但還是不給力,不完美,不perfect,就是不爽,于是請(qǐng)將注意力轉(zhuǎn)移到紅色加粗字體上,寫上它就OK了。


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 精品熟女少妇a∨免费久久| 97在线视频免费公开观看| 最近2019免费中文字幕6| 日韩免费视频播播| 亚洲国产精品高清久久久| 亚洲乱亚洲乱妇无码| a级成人免费毛片完整版| 成人免费无码大片A毛片抽搐| 在线美女免费观看网站h| 免费不卡中文字幕在线| 亚洲香蕉免费有线视频| 一级毛片正片免费视频手机看| 在线看无码的免费网站| 亚洲精品高清在线| 456亚洲人成在线播放网站| 免费人成激情视频在线观看冫 | 亚洲精品无码MV在线观看| 亚洲av无码片在线观看| a级成人毛片免费视频高清| 日本不卡免费新一二三区| 亚洲一区二区中文| 免费精品久久久久久中文字幕| **aaaaa毛片免费同男同女| 亚洲色婷婷综合开心网| 亚洲an日韩专区在线| 18禁超污无遮挡无码免费网站| 精品国产免费一区二区| 亚洲麻豆精品果冻传媒| 成人A毛片免费观看网站| 日产乱码一卡二卡三免费| 亚洲1区1区3区4区产品乱码芒果| 99久久免费国产精品热| 四虎国产精品免费久久影院| 亚洲国产日韩在线人成下载| baoyu122.永久免费视频| 婷婷综合缴情亚洲狠狠尤物| 日韩亚洲国产综合高清| 最近的中文字幕大全免费8| 伊人久久大香线蕉亚洲五月天 | 亚洲熟妇无码八V在线播放| 99在线热视频只有精品免费|