2015-06-11 62 views
1

我有一个记录登录活动的表。在我的应用仪表板中,我想显示图表中的最后登录。用户每小时登录的次数。查询是这样的返回结果:hql查询获取最近12小时的记录

time       count 
-------      -------- 
9.00.00 - 9.59.59   1 
10.00.00 - 10.59.59   0 
11.00.00 - 11.59.59   13 
12.00.00 - 12.59.59   7 
13.00.00 - 13.59.59   4 

实体(LoginActivity)dateLastUpdated领域,对其中的查询应该努力。什么将查询获得预期的结果?一个适当的原生解决方法查询也将不胜感激。

回答

4

试试这个

Query query = session.createQuery("select la from LoginActivity la where la.dateLastUpdated > :date"); 
Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.HOUR, -12); 
Date date = cal.getTime(); 
query.setParameter("date", date); 
List result = query.list(); 

这里有一个较短的例子

Query query = session.createQuery("select la from LoginActivity la where la.dateLastUpdated > :date"); 
query.setParameter("date", new Date(System.currentTimeMillis() - 12*60*60*1000); 
List result = query.list(); 

编辑

继纪尧姆波莱的例子(upvoted),原来有一个JPA办法做到这一点(比使用数据库供应商特定的SQL函数要好得多)。此代码正在为我工​​作

String query = "select hour(la.dateLastUpdated) as hour, count (la) from LoginActivity la " + 
     "where la.dateLastUpdated > :date " + 
     "group by hour(la.dateLastUpdated) " + 
     "order by hour(la.dateLastUpdated)"; 

    List<Object[]> objects = getSession().createQuery(query).setParameter("date", date).list(); 

    for (Object[] o : objects) { 
     Object hour = o[0]; 
     Object count = o[1]; 
     System.out.println(hour + ".00.00 - " + hour + ".59.59\t" + count); 
    } 
+0

它会给在最后12小时中的所有记录的东西。但我的预期结果是每小时计数。它怎么可能是相同的 – fatCop

+1

你说得对,我没有很好地阅读这个问题。我认为原生SQL是唯一的选择,如果我拿出一个工作示例,将更新我的答案。 –

+0

谢谢。本机SQL将为我做。 – fatCop

2

您的查询将需要依赖一些hibernate细节来处理组和时间间隔操作。

库仑不是测试,但它应该是沿着这些线路

String query = "Select day (la.dateLastUpdated) as day, hour(la.dateLastUpdated) as hour, count (la) 
From LoginActivity la 
Where la.dateLastUpdated > :date 
Group by day, hour 
Order by day, hour"; 

List <Object []> objects = em.createQuery (query, Object [].class).setParameter ("date", new Date (System.currentTimeInMillis()-TimeUnit.HOURS.toMillis (12))).getResultList(); 
for(Object [] o:objects) { 
     Object hour = o[1]; 
     Object count = o [2]; 
     System.out.println (hour + ".00.00 - " + hour + "59.59\t" + count); 
} 
+0

小时。你能为此提出任何建议吗? – fatCop

+0

@fatCop您可以检查循环中是否缺少任何预计的小时数,并自动填充可能的间隔。 –

+0

是的,目前我也是这样做的。但是,查询是否可以返回预期的结果集? – fatCop