【问题标题】:Hibernate result grouping by year/month of dateHibernate 结果按日期的年/月分组
【发布时间】:2014-04-27 00:09:06
【问题描述】:

对于显示给定时间段内文章的销售统计数据的近乎经典的任务,我偶然发现了一个有趣的问题:假设,我有一个包含文章编号、金额和日期的数据库表,我想将文章分组他们的金额首先按年份(过去两年的概览)和按月的细化详细视图。

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

  1. 请求表中的所有条目(1 个 SQL 请求)。
  2. 仅请求给定期间的条目(2 个 SQL 请求用于年度概览,12 个 SQL 请求用于月图)。

我想知道是否有更实用的方法利用 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 篇文章)。

到目前为止,谢谢你, 斯穆特耶

【问题讨论】:

  • 确实很有趣的问题,使用 SQL 应该相当容易 - 但是将其转换为 HQL...this 有什么帮助吗?
  • 谢谢,我明天试试!

标签: java sql hibernate


【解决方案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));

【讨论】:

  • 问题是,我的表中没有year_started 列(参见SQL Fiddle 示例),而是一个完整的date 来支持月度和年度统计,而不保留冗余数据。跨度>
猜你喜欢
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
相关资源
最近更新 更多