今天在网上闲逛发现了一个新招,代码如下(只贴出回调函数里的代码了):
灰色斜体为业务相关代码,请无视
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了。