如何检索由to_days + COUNT(*)聚集的hibernate项目

时间:2013-05-10 10:21:19

标签: mysql hibernate date

我再次对hibernate很新,所以这可能是一个愚蠢的问题;)。

没有to_days,但按时间戳聚集,它的工作原理如下:

    CriteriaQuery<Tuple> query = criteriaBuilder.createQuery(Tuple.class);
    Root<Session> sessionRoot = query.from(Session.class);
    query.multiselect(
                sessionRoot.get("time").alias("time"),
                criteriaBuilder.count(sessionRoot).alias("count")
            );
    query.groupBy(sessionRoot.get("time"));
    List<Tuple> results = this.executeQuery(query);

所以我收到了:

time|count
13721938721|1
13721938722|2
13721938723|3
13721938724|4
13721938725|2
13721938726|1
13721938727|4

但是这都是每毫秒的会话数量,但是我需要那些按天而不是按时间戳聚集的那些:因此我在普通的mysql中使用to_days。

在mysql中我执行此查询:

SELECT TO_DAYS(`time`) AS `days`, COUNT(*) as `count` FROM sessions WHERE 1 GROUP BY `days`

这给了我:

days|count
777594|123
777595|60
777596|61
777597|74

但我还不知道:如何在hibernate中使用javax.persistence.criteria.CriteriaBuilder和CriteriaQuery实现相同的功能?

2 个答案:

答案 0 :(得分:0)

我不知道如何使用criteriaBuilder,但我知道如何在Hibernate 4标准api:

query.setProjection(
    Projections.sqlProjection(
        "TO_DAYS(time) as days",
        new String[]{"days"},
        new Type[]{StandardBasicTypes.INTEGER}
    )
);

sqlProjection允许您转换或转换数据类型,但小心,使用投影只会检索您在其中指定的文件,结果列表将如下所示:

 List<Object[]> results = this.executeQuery(query);

但是你可以让hibernate使用结果转换器与属性进行别名匹配:

query.setResultTransformer(new AliasToBeanResultTransformer(Session.class));

并且列表就像通常那样出现:

List<Session.class> results = this.executeQuery(query);

抱歉,我无法提供criteriaBuilder解决方案,但我希望这能让您走上正轨。

答案 1 :(得分:0)

经过一番调查后发现,HQL不支持TO_DAYS。由于我想让MySQL和其他数据库成为可能,这是我的最终解决方案:

Query q = entityManager.createQuery("SELECT concat(day(e.time), '-', month(e.time), '-', year(e.time)) AS days, COUNT(*) FROM Event e GROUP BY concat(day(e.time), '-', month(e.time), '-', year(e.time))");

结果是:

3-5-2012|980
4-5-2012|200
10-6-2012|123
12-6-2012|144
13-11-2012|500

之后我将所有丑陋的日期字符串转换为java中的正确毫秒,并获得我需要的数据。