J'ai ceci:Faire une requête pour chaque jour dans une période, le transformant en une requête
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();
}
}
Cette exécute une requête pour chaque jour dans une période donnée (la période étant de l'ordre de grandeur un mois).
Puis-je obtenir ces données spécifiques en une seule requête? J'utilise Hibernate/MySQL, mais je préfère ne pas avoir besoin de fonctions non standard.
Cela fonctionnerait, mais d'où vient cette fonction 'date'? Est-ce MySQL ou standard JPA/JPQL? Existe-t-il un équivalent dans l'API Criteria? –
Je ne suis pas tout à fait sûr, mais je ne pense pas qu'il existe des fonctions de manipulation de date explicites dans le JPQL (autre que d'obtenir la date/heure actuelle). –
Selon les docs, date() est une fonction MySQL qui renvoie la date d'une expression de date ou d'horodatage. http://dev.mysql.com/doc/refman/5.5/fr/date-and-time-functions.html#function_date –