<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分頁產生的問題

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

    今天在網上閑逛發現了一個新招,代碼如下(只貼出回調函數里的代碼了):

    灰色斜體為業務相關代碼,請無視

    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);  // 業務代碼,請無視
        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();
    }

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


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 久久久无码精品亚洲日韩软件| 亚洲成人在线免费观看| 亚洲 综合 国产 欧洲 丝袜 | 久久精品亚洲综合专区| 视频免费在线观看| 国产AV无码专区亚洲Av| 无码人妻一区二区三区免费n鬼沢| 亚洲精品无码永久在线观看你懂的 | 美女羞羞喷液视频免费| 免费永久看黄在线观看app| 色屁屁在线观看视频免费| 91麻豆精品国产自产在线观看亚洲 | 国产精品亚洲精品日韩已方| 国产成人高清精品免费观看| 亚洲国产精品乱码一区二区| 最刺激黄a大片免费网站| 国产日本亚洲一区二区三区| 国产精品久久香蕉免费播放| 免费国产草莓视频在线观看黄| 精品国产亚洲男女在线线电影| 男女午夜24式免费视频| 精品亚洲AV无码一区二区三区 | 亚洲欧洲自拍拍偷午夜色无码| 中文无码成人免费视频在线观看| 亚洲成电影在线观看青青| 国产精品黄页在线播放免费| 中文字幕无码免费久久9一区9| 亚洲精品在线观看视频| 在线jlzzjlzz免费播放| 中文在线观看国语高清免费| 亚洲精品中文字幕麻豆| 免费观看a级毛片| 毛片在线全部免费观看| 亚洲色欲色欱wwW在线| 亚洲综合网站色欲色欲| 国产精品久久永久免费| 人人爽人人爽人人片A免费| 亚洲大片免费观看| 亚洲av中文无码| 日本最新免费网站| 永久免费观看黄网站|