Hibernate中的标准,用于在List中返回一些聚合结果

时间:2014-01-05 00:23:38

标签: java hibernate postgresql hibernate-criteria

这是我的代码。问题是我的结果列表总是返回1的大小而不是预期的大小为4。该列表应包含max,min,avg,count的值。谢谢你的帮助

Criteria crit = session.createCriteria(Mastercsv.class);
Mastercsv mastercsv = new Mastercsv();
ProjectionList proList = Projections.projectionList();

proList.add(Projections.max("hostsCount"));
proList.add(Projections.min("hostsCount"));
proList.add(Projections.avg("hostsCount"));
proList.add(Projections.count("installedModule"));
crit.setProjection(proList);
crit.add(Restrictions.eq("installedModule", type));
crit.add(Restrictions.between("dateReported", startDate, endDate));
List results = crit.list();

1 个答案:

答案 0 :(得分:1)

这是对结果列表中项目的误解。列表的大小不受选择数量(最大值,最小值,平均值,计数)的影响。在这种情况下,列表的预期大小为1,因为它是使用聚合函数进行简单选择而不进行分组。

列表中的唯一项目是对象数组,其中包含所有四个选定值的选择顺序。结果可以是以下的探险家:

List results = crit.list();
for (Object item: results) {
   Object[] itemArr = (Object[]) item;
   System.out.println("max: "+ itemArr[0].getClass() +" " + itemArr[0]);
   System.out.println("min: "+ itemArr[1].getClass() +" " + itemArr[1]);
   System.out.println("avg: "+ itemArr[2].getClass() +" " + itemArr[2]);
   System.out.println("count: "+ itemArr[3].getClass() +" " + itemArr[3]);
}

可以在理解其类型时分配数组中的值。例如,如果hostsCount的类型为Integer,则可以使用以下内容:

Integer max = (Integer) itemArr[0];

因为已知查询不返回多行,而不是Criteria.list,我们可以使用:

Object[] itemArr = (Object[]) crit.uniqueResult();