使用所有登录时间按日期对查询进行休眠分组

Hibernate query to group by Date with all logintime

本文关键字:查询 休眠 日期 登录 时间      更新时间:2023-10-31

我想显示特定日期的每个登录时间。但我得到了每个时间的日期和时间。像

result is:-
 date          logintime          
2016-03-31      2016-03-31 (time)
2016-03-31      2016-03-31 (time)
2016-03-31      2016-03-31 (time)
But I want:-
date               logintime 
2016-03-31         2016-03-31 (time)
                   2016-03-31 (time)
                   2016-03-31 (time)

USERDAO类:

public List<LoginLog> UserHistory(User user){
    String sql="from LoginLog where user = :user";
    TypedQuery<LoginLog> query = em.createQuery(sql, LoginLog.class);
    query.setParameter("user", user);
    List<LoginLog> logs = query.getResultList();
    return logs;
}

默认用户类

@Override
    @Transactional
    public LoginLog punchLoginTime(User user) {
    LoginLog log = new LoginLog();
    log.setLoginTime(new Date());
    log.setUser(user);
    loginLogDao.create(log);
    return log;
}
@Override
@Transactional
public LoginLog punchLogoutTime(User user) {
    LoginLog log = getOpenUserLoginLog(user);
    log.setLogoutTime(new Date());
    long diff=log.getLogoutTime().getTime()-log.getLoginTime().getTime();
    log.setTotalTime(diff);
    log = loginLogDao.update(log);
    return log;
}
@Override
public boolean hasUserStarted(User user) {
    LoginLog log = loginLogDao.getOpenLoginLog(user);
    if (log == null) {
        return false;
    } else {
        return true;
    }
}
@Override
public LoginLog getOpenUserLoginLog(User user) {
    return loginLogDao.getOpenLoginLog(user);
}
@Override
public List<LoginLog> UserHistroy(User user) {
    return loginLogDao.UserHistory(user);
}

LOGIN_CONTROLLER类

@RequestMapping(value = "/userloginhistory", method = { RequestMethod.GET })
    public String loginHistory(HttpServletRequest request, Model model) {
    List<LoginLog> logs = userService.UserHistroy(TimesheetSecutiryUtil
            .getLoggedInUser(request.getSession()));
    model.addAttribute("loginList", logs);
    return "userloginhistory";
}

这是Jsp。由于我是新手,有人能告诉我该怎么做吗?(通过hibernate查询或在jsp级别,如何?)谢谢

<table border="1">
  <thead>
     <tr>
       <td>Login Id</td>
       <td>Login Time</td>
       <td>Logout Time</td>
       <td>Total Time(in Minutes)</td>
      </tr>
  </thead>
<%
    List<LoginLog> log = (List<LoginLog>)request.getAttribute("loginList");
    if(log != null) {
       for(LoginLog login : log) {
 %>
<tr>
<td><%=login.getId()%></td>
<td><%=login.getLoginTime()%></td>
<td><%=login.getLogoutTime()%></td>
<td id="a<%=login.getId()%>">
     <span id="time<%=login.getId()%>"> 
     <%=login.getTotalTime()%></span> <script>
    var milliSeconds = document.getElementById("time<%=login.getId()%>").innerHTML;
    var c = convertTime(milliSeconds);
    document.getElementById("a<%=login.getId()%>").innerHTML = c;
  </script></td>
</tr>
<%
    }
 }
%>
 </table>

如果可以选择使用Guava,则可以轻松地将List<LoginLog>转换为多映射,并返回ImmutableListMultimap使其可用于JSP文件。例如,

private static class LoginLog {
    private Date loginTime;
    private Date logoutTime;
    LoginLog(Date loginTime) {
        this.loginTime = loginTime
    }
    // Getters and setters
}

以及分组功能

private enum GroupBy implements Function<LoginLog, String> {
    LOGIN_TIME
    @Override
    String apply(LoginLog loginLog) {
        return new SimpleDateFormat("yyyy-MM-dd").format(loginLog.loginTime)
    }
}

并使用索引方法

ImmutableListMultimap<String, LoginLog> listMultimap =  Multimaps.index(logs, GroupBy.LOGIN_TIME);

我不认为你可以用纯HQL查询获得类似于多地图提供的输出,你仍然需要像使用一样获得所有结果

List<LoginLog> logs = query.getResultList();

类似的地图数据结构也可以通过循环遍历logs列表来生成。