Hibernate Criteria分頁產生的問題

轉自http://www.cnblogs.com/icewee/articles/2017686.html
大家都知道做分頁必須要知道總記錄數,這就爲我們出了一到小題兒,往往我們直接用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了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章