0

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);
    }
Hari
  • 11
  • 4

1 Answers1

0

What is your real order criteria ?

Would you sort it by the id of timeslices or the count ?

Why don't you sort it by yourself with a Comparator?

Here could you find a few examples

Comparator Examples

Comparator<yourClass> yourComparator = new Comparator(){
  public int compare(yourClass yc1,yourClass yc2){
    return yc1.getStartTime().compare(yc2.getStartTime());
  }
};

Collection<yourClass> c = criteria.list();
for(yourClass tmp : c){
  Collections.sort(c.getTimeSlices(), yourComparator);
}
Community
  • 1
  • 1
diel2001
  • 131
  • 1
  • 5