我正在尝试使用 HQL 按月对某些行进行分组,但我是该 API 的新手,似乎无法使其正常工作。
这是我的代码:
Criteria query = getHibernateSession().createCriteria(SalesPerformance.class);
// summary report is grouped by date
query.setProjection(Projections.projectionList().add(
Projections.groupProperty("effectiveDate"), "effectiveDate").add(
Projections.groupProperty("primaryKey.seller", "seller").add(
Projections.sum("totalSales"))));
// sub-select based on seller id
query.add(Property.forName("primaryKey.seller.id").eq(sellerId)).setFetchMode(
"primaryKey.seller", FetchMode.SELECT);
query.add(Property.forName("primaryKey.effectiveDate").le(new Date()));
query.add(Property.forName("primaryKey.effectiveDate").ge(DateUtils.truncate(new Date(), Calendar.MONTH)));
query.addOrder(Order.desc("primaryKey.effectiveDate"));
return query.list();
这个查询的问题是,由于 Projections.groupProperty("effectiveDate"),当我每月需要一行时,它会每天返回一行。
我考虑过使用 Projections.sqlGroupProjection 而不是 Projections.groupProperty 并加入一些 HQL,但是我找到的文档和几个示例并没有真正帮助我理解如何将正确的 postresql 语句放入该方法.
任何了解 Postgres 和 HQL 的人都可以在这里给出一些提示吗?
最佳答案
找到解决方案:
Criteria query = getHibernateSession().createCriteria(SalesPerformance.class);
// summary report is grouped by date
query.setProjection(Projections.projectionList().add(Projections.sqlGroupProjection("date_trunc('month', eff_dt) as eff_dt_value", "eff_dt_value", new String[] {"eff_dt_value"}, new Type[] {Hibernate.DATE})).add(
Projections.groupProperty("primaryKey.seller", "seller").add(
Projections.sum("totalSales"))));
// sub-select based on seller id
query.add(Property.forName("primaryKey.seller.id").eq(sellerId)).setFetchMode(
"primaryKey.seller", FetchMode.SELECT);
query.add(Property.forName("primaryKey.effectiveDate").le(new Date()));
Date beginningOfLastMonth = DateUtils.truncate(DateUtils.addMonths(new Date(), -1) , Calendar.MONTH);
Date endOfLastMonth = DateUtils.addDays(DateUtils.truncate(new Date(), Calendar.MONTH), -1);
query.add(Property.forName("primaryKey.effectiveDate").between(beginningOfLastMonth, endOfLastMonth));
return query.list();
请注意,在我的例子中,我需要使用上个月的 effectiveDate 获取值。
希望这能帮助到同一条船上的其他人! :)
关于hibernate - HQL : group by month,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/926948/