2015-06-11 2 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(); 

EDIT

Следуя примеру Гийома POLET в (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

часов с регистрационным номером '0' не отображаются. Можете ли вы предложить что-нибудь для этого? – fatCop

+0

@fatCop Вы можете проверить цикл, если какой-либо из ожидаемых часов отсутствует, и автоматически переверните все возможные пробелы. –

+0

Да, в настоящее время я делаю то же самое. Но может ли запрос вернуть ожидаемый набор результатов? – fatCop

Смежные вопросы