在我们公司的项目中,代码过于老旧,hibernate返回的结果是数组而不是map或者数据表对象。
这会导致一个问题,我们需要通过数据得下标获取数据,我觉得这很不便于维护,数据量过多的时候,过多的下标容易导致各种问题。
我的目标是hibernate返回一个map,我可以通过key进行获取数据,或者呢,直接把map转成对象,这样子更健壮一些
代码:
/**
* 分页查询,返回结果为map<br>
* @param pageData 分页对象
* @param originalSql 原始的查询sql
* @param needCount 是否需要计数
* @return
*/
@SuppressWarnings("unchecked")
private PageData<Map<String, Object>> listPageBySql(PageData<Map<String, Object>> pageData, String originalSql, boolean needCount) {
if (pageData == null) { // 判断数据是否为空
pageData = new PageData<Map<String, Object>>();
}
if (needCount && pageData.getTotalCount() == 0 ) { // 需要进行count查询语句,拼接外层sql
StringBuilder countSql = new StringBuilder("select count(*) from ( ");
countSql.append(originalSql);
countSql.append(" ) t_count ");
SQLQuery countQuery = getSession().createSQLQuery(countSql.toString());
Object count = countQuery.uniqueResult();
pageData.setTotalCount(Integer.valueOf(String.valueOf(count)));
if (pageData.getTotalCount() == 0) {
pageData.setResult(new ArrayList<Map<String, Object>>());
return pageData;
}
} else {
pageData.setTotalCount(pageData.getTotalCount());
}
// 设置返回结果为map,而不是Object[]
SQLQuery query = getSession().createSQLQuery(originalSql);
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
// 设置页码
query.setFirstResult((pageData.getPageNo()-1)*pageData.getPageSize());
query.setMaxResults(pageData.getPageSize());
// 查询结果
List<Map<String, Object>> resultList = query.list();
pageData.setResult(resultList);
return pageData;
}