Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在一段时间内每天执行一个查询,并将其转换为一个查询_Java_Sql_Database_Jpa_Jpql - Fatal编程技术网

Java 在一段时间内每天执行一个查询,并将其转换为一个查询

Java 在一段时间内每天执行一个查询,并将其转换为一个查询,java,sql,database,jpa,jpql,Java,Sql,Database,Jpa,Jpql,我有这个: 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)) { Criteri

我有这个:

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

 }
publicmap getUniqueLogins(长fromTime,长toTime){
EntityManager em=emf.createEntityManager();
试一试{
映射结果映射=新。。。;
for(Day-Day:daysInPeriod(fromTime,toTime)){
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery q=cb.createQuery(Long.class);
//来自用户会话
Root userSess=q.from(UserSession.class);
//选择计数(不同的用户ID)
q、 选择(cb.countDistinct(userSess.get(“userId”));
//登录时间在哪里。。。
q、 其中(cb.between(userSess.get(“loginTime”)、day.startDate()、day.endDate());
long result=em.createQuery(q).getSingleResult();
结果图put(天,(整数)结果);
}
返回结果图;
}最后{
em.close();
}
}
这将对给定时间段(时间段的数量级为一个月)中的每一天执行查询


我能在一次查询中得到这个特定的数据吗?我使用的是Hibernate/MySQL,但我不希望需要任何非标准函数。

根据LoginTime的日期段对不同的用户ID进行分组。后端应提供提取日期时间值的日期部分的方法。

假设原始查询为:

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;

您必须使用特定于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会将登录时间转换为若干天,然后返回到日期时间,但小时/分钟/秒部分为零。

这会起作用,但该
日期功能从何而来?它是MySQL还是标准JPA/JPQL?Criteria API中是否有类似的函数?我不太确定,但我认为JPQL中没有任何显式的日期操作函数(除了获取当前日期/时间)。根据文档,date()是一个MySQL函数,它从日期或时间戳表达式返回日期。