<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了。


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


    網站導航:
     
    主站蜘蛛池模板: 青青草国产免费久久久91| 91禁漫免费进入| 免费高清av一区二区三区| 国产精品亚洲精品观看不卡| 久久久久免费精品国产| 亚洲成在人线av| 精品亚洲永久免费精品| 亚洲午夜精品一区二区| 成人久久免费网站| 亚洲2022国产成人精品无码区| 精品一区二区三区免费| 精品亚洲综合在线第一区| 水蜜桃视频在线观看免费播放高清| 亚洲中文字幕无码永久在线| 中国好声音第二季免费播放| 国产亚洲免费的视频看| 51视频精品全部免费最新| 亚洲最大在线视频| 国产精品酒店视频免费看| 二个人看的www免费视频| 亚洲午夜久久久久久久久久| 日本免费一区二区三区| 18gay台湾男同亚洲男同| 成年女人免费v片| 国产精品亚洲二区在线| 自拍偷自拍亚洲精品第1页| 99ee6热久久免费精品6| 亚洲精品国产suv一区88| 亚洲精品无码MV在线观看| 在线观看免费av网站| 亚洲AV无码AV日韩AV网站| 激情97综合亚洲色婷婷五| 免费在线视频你懂的| 午夜亚洲乱码伦小说区69堂| 国产亚洲综合网曝门系列| 100000免费啪啪18免进| 黄页网站在线免费观看| 亚洲综合激情六月婷婷在线观看| 69成人免费视频| 久久九九久精品国产免费直播| 亚洲视频在线观看免费视频|