postgresql上Hibernate的DetachedCriteria同时添加addOrder和Projections.rowCount()运行出错。

来源:互联网 发布:win10 自动优化 编辑:程序博客网 时间:2024/06/05 10:02

使用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);

才能正常运行。


原创粉丝点击