Выполнение запроса для каждого дня в периоде, превращение его в один запрос - PullRequest
3 голосов
/ 15 декабря 2010

У меня есть это:

public Map<Day,Integer> getUniqueLogins(long fromTime, long toTime) {

  EntityManager em = emf.createEntityManager();
  try {
   Map<Day,Integer> resultMap = new ...;
   for (Day day : daysInPeriod(fromTime, toTime)) {

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Long> q = cb.createQuery(Long.class);

    // FROM UserSession
    Root<UserSession> userSess = q.from(UserSession.class);
    // SELECT COUNT(DISTINCT userId)
    q.select(cb.countDistinct(userSess.<Long>get("userId")));
    // WHERE loginTime BETWEEN ...
    q.where(cb.between(userSess.<Date>get("loginTime"), day.startDate(), day.endDate()));

    long result = em.createQuery(q).getSingleResult();
    resultMap.put(day, (int) result);
   }
   return resultMap;
  } finally {
   em.close();
  }

 }

Это выполняет запрос для каждого дня в данном периоде (период в порядке величины месяца).

Могу ли я получитьэто конкретные данные в одном запросе?Я использую Hibernate / MySQL, но я бы предпочел не использовать нестандартные функции.

Ответы [ 3 ]

2 голосов
/ 15 декабря 2010

Предполагая, что ваш исходный запрос:

SELECT COUNT(DISTINCT userId)
FROM UserSession
WHERE loginTime BETWEEN dayStart AND dayEnd;

Это должно вернуть те же результаты, что и исходный запрос за каждый день периода:

SELECT date(loginTime) AS day, COUNT(DISTINCT userId)
FROM UserSession
WHERE loginTime BETWEEN startDate AND endDate
GROUP BY day;
1 голос
/ 09 января 2011

Для этого вам понадобятся специальные функции MySQL.

SELECT FROM_DAYS(TO_DAYS(loginTime)) AS day, COUNT(DISTINCT userId)
FROM UserSession
WHERE loginTime BETWEEN :fromTime AND :toTime
GROUP BY day

From_days / to_days преобразует loginTime в число дней, а затем обратно в datetime, но с часами / минутами/ второй части нулевой.

1 голос
/ 15 декабря 2010

GROUP BY Сегмент даты LoginTime с учетом различных идентификаторов пользователей.Серверная часть должна обеспечивать способ извлечения части даты из значения даты и времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...