Hibernate结果按日期/月份分组

时间:2014-03-20 09:03:06

标签: java sql hibernate

对于在给定时间段内显示文章销售统计数据的近乎经典的任务,我偶然发现了一个有趣的问题:鉴于,我有一个包含文章编号,数量和日期的数据库表,我想将文章分组他们的金额是逐年(概述的最后两年)和按月精确的详细视图。

到目前为止,我的解决方案都基于Hibernate-Entity方法,只要我请求实体并使用以下策略将它们分组为Java

  1. 请求表中的所有条目(1个SQL请求)。
  2. 仅请求给定期间的条目(年度概览的2个SQL请求,月份图的12个请求)。
  3. 我想知道是否有更实用的方法利用SQL(使用Hibernate)的优点,理想情况下在Java中没有任何分组代码,我创建了一个小的SQL Fiddle示例(http://sqlfiddle.com/#!2/97a5d)来演示结果(2013 :8篇文章,2012年:18篇文章// 2013年9月:5篇文章,2013年6月:3篇文章,2012年6月:7篇文章,2012年2月:11篇文章)。

    谢谢你到目前为止, Smutje

1 个答案:

答案 0 :(得分:1)

您可以使用投影(例如sqlProjection)并将它们添加到您的休眠标准中以检索所需的结果。

例如来自here

的代码
HibernateTemplate ht = new HibernateTemplate(sessionFactory);

DetachedCriteria criteria = DetachedCriteria
        .forClass(Departments.class);

ProjectionList pl = Projections.projectionList();
pl.add(Projections.groupProperty("yearStarted"));
pl.add(Projections.sqlProjection("count(*) AS countOne, year_started AS ys",
        new String[] { "countOne", "ys" }, new Type[] {
                Hibernate.INTEGER, Hibernate.INTEGER }));

criteria.setProjection(pl);

List results = ht.findByCriteria(criteria);
System.out.println("Count : " + results.size());
System.out.println("First Value : " + results.get(0));