今天在網(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了。