使用Hibernate操作postgresql,一般情况下在带分页的页面,用DetachedCriteria查询返回页面需要的数据总条数和一页的数据量。
以下代码运行时会出错:
DetachedCriteria criteria = DetachedCriteria.forClass(***);
criteria.addOrder(Order.desc("hostName"));
criteria.setProjection(Projections.rowCount());
这个可能和数据库有关,oracle上没问题。
在postgresql上执行一下hibernate生成的sql,报错如下:
SQL Error: ERROR: column "ci_server_list.host_name" must appear in the GROUP BY clause or be used in an aggregate functionLINE 1: select count(*) from ci_server_list order by host_name ^
果真,在select count(*)里面不能用 order by。
解决的办法如下:
public Integer getRowCountByCriteria(DetachedCriteria detachedCriteria) throws Exception {
Criteria criteria = detachedCriteria.getExecutableCriteria(this.getSession());
List orderEntrys = new ArrayList();
Field field = CriteriaImpl.class.getDeclaredField("orderEntries");
field.setAccessible(true);
orderEntrys = (List) field.get(criteria);
field.set(criteria,new ArrayList());
criteria.setProjection(Projections.rowCount());
int totalCount = Integer.valueOf(criteria.uniqueResult().toString());
//clean
criteria.setProjection(null);
field.set(criteria,orderEntrys);
return totalCount;
}
用反射强行把orderEntrys清除,得到正确结果后再设置回去。
注意对私有属性,一定要先
field.setAccessible(true);
才能正常运行。