我再次对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实现相同的功能?
答案 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中的正确毫秒,并获得我需要的数据。