【问题标题】:hql query for getting record for last 12 hourshql 查询获取最近 12 小时的记录
【发布时间】:2015-06-11 09:29:57
【问题描述】:

我有一个表格来记录登录活动。在我的应用仪表板中,我想在图表中显示最后一次登录。每小时间隔登录的用户数。查询返回结果如下:

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

entity(LoginActivity)具有dateLastUpdated 字段,查询应在该字段上运行。获得预期结果的查询是什么?适当的本机解决方法查询也将受到赞赏。

【问题讨论】:

    标签: java sql hibernate


    【解决方案1】:

    试试这个

    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();
    

    编辑

    按照 Guillaume Polet 的示例(赞成),事实证明有一种 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);
        }
    

    【讨论】:

    • 它会给出过去 12 小时内的所有记录。但我的预期结果是每小时计数。怎么会一样
    • 你说得对,我没有很好地阅读这个问题。我认为本机 SQL 是这里唯一的选择,如果我想出一个工作示例,我会更新我的答案。
    • 您使用的是哪个数据库?
    • 它不返回计数 0 条目。我怎样才能得到它?
    【解决方案2】:

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

    无法测试它,但它应该是类似的东西

     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 您可以在循环中检查是否缺少任何预期的时间,并自己自动填补可能的空白。
    • 是的,目前我也在这样做。但是查询能否返回预期的结果集?
    • @fatCop 在纯 hql 中?这不太可能。也许使用一些特定于数据库的特性和本机查询可以实现这一点,但这与在内存中做的工作量差不多。在内存中执行此操作的开销很小,所以我会坚持这种方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2014-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    相关资源
    最近更新 更多