My basic timeslice class is as follows.
package com.sms.attendance;
import java.util.Date;
public class TimeSlice
{
private Integer id, attendanceId,userId;
private String name;
private boolean present;
private Date startTime;
private Date endTime;
public TimeSlice(String name, boolean present, Date startTime, Date endTime)
{
super();
this.name = name;
this.present = present;
this.startTime = startTime;
this.endTime = endTime;
}
public TimeSlice()
{
}
//getters and setters
}
office time class as follows
package com.infi.sms.attendance;
import java.util.Date;
public class OfficeTime
{
private Integer id;
private Date startTime;
private Date endTime;
private Date lunchBreakStartTime;
private Date lunchBreakEndTime;
private Integer period;
public OfficeTime(Date startTime, Date endTime, Date lunchBreakStartTime, Date lunchBreakEndTime, Integer period)
{
super();
this.startTime = startTime;
this.endTime = endTime;
this.lunchBreakStartTime = lunchBreakStartTime;
this.lunchBreakEndTime = lunchBreakEndTime;
this.period = period;
}
public OfficeTime()
{
}
//setters and getters
}
And finally attendence class
package com.sms.attendance;
import java.util.Date;
import java.util.Set;
public class Attendance
{
private Integer id,userId;
private Date date;
private OfficeTime officeTime;
private Set<TimeSlice> timeSlices;
public Attendance(Date date, OfficeTime officeTime, Set<TimeSlice> timeSlices)
{
super();
this.date = date;
this.officeTime = officeTime;
this.timeSlices = timeSlices;
}
public Attendance()
{
}
//getters and setters
}
The criteria code is
package com.sms.attendance;
import java.time.Instant;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.Calendar;
import java.util.Date;
public class MAIN
{
public static Set<Attendance> getAttendanceForCurrentWeek(Integer id,Date eDate)
{
Criteria criteria = getSession().createCriteria(Attendance.class);
criteria.add(Restrictions.ge("date", getStartDate(eDate)));
criteria.add(Restrictions.le("date", eDate));
criteria.add(Restrictions.eq("userId", id));
criteria.addOrder(Order.asc("timeSlices"));
return criteria.list().isEmpty() ? Collections.emptySet(): new LinkedHashSet(criteria.list());
}
private static Date getStartDate(Date eDate)
{
return new Date(eDate.toInstant().minus(eDate.getDay() == 0 ? 6 : eDate.getDay()-1 , ChronoUnit.DAYS).toEpochMilli());
}
public static void main(String[] args)
{
Calendar instance = Calendar.getInstance();
instance.set(2015, 5, 5);
for (Attendance attendance: getAttendanceForCurrentWeek(1, instance.getTime()))
{
for(TimeSlice timeSlice:attendance.getTimeSlices())
{
System.out.println("timeslice"+timeSlice);
}
}
}
}
the output is like
timesliceTimeSlice [id=4, attendanceId=1, userId=1, name=12:30 to 13:30, present=false, startTime=2015-06-05 12:30:37.0, endTime=2015-06-05 13:30:37.0]
timesliceTimeSlice [id=9, attendanceId=1, userId=1, name=17:30 to 18:30, present=false, startTime=2015-06-05 17:30:37.0, endTime=2015-06-05 18:30:37.0]
timesliceTimeSlice [id=6, attendanceId=1, userId=1, name=14:30 to 15:30, present=false, startTime=2015-06-05 14:30:37.0, endTime=2015-06-05 15:30:37.0]
timesliceTimeSlice [id=3, attendanceId=1, userId=1, name=11:30 to 12:30, present=true, startTime=2015-06-05 11:30:37.0, endTime=2015-06-05 12:30:37.0]
timesliceTimeSlice [id=1, attendanceId=1, userId=1, name=09:30 to 10:30, present=true, startTime=2015-06-05 09:30:37.0, endTime=2015-06-05 10:30:37.0]
timesliceTimeSlice [id=2, attendanceId=1, userId=1, name=10:30 to 11:30, present=true, startTime=2015-06-05 10:30:37.0, endTime=2015-06-05 11:30:37.0]
timesliceTimeSlice [id=5, attendanceId=1, userId=1, name=13:30 to 14:30, present=false, startTime=2015-06-05 13:30:37.0, endTime=2015-06-05 14:30:37.0]
timesliceTimeSlice [id=7, attendanceId=1, userId=1, name=15:30 to 16:30, present=false, startTime=2015-06-05 15:30:37.0, endTime=2015-06-05 16:30:37.0]
timesliceTimeSlice [id=8, attendanceId=1, userId=1, name=16:30 to 17:30, present=false, startTime=2015-06-05 16:30:37.0, endTime=2015-06-05 17:30:37.0]
Now i have a list of attendance objects in database. The requirement was like order by time slice starting time. i tried for long time. while i use addorder by timeslices.getStartTime it throws exception.. help me to get order by as starttime. thanks in advance.
finally i got it. this is what i have done.. In attendance class i just make the setter as like
public void setTimeSlices(Set<TimeSlice> timeSlices) {
this.timeSlices = new TreeSet<TimeSlice>(timeSlices);
}
and i implemented comparable interface with startTime like
public int compareTo(TimeSlice t)
{
return startTime.compareTo(t.startTime);
}