投影分组分离标准

Projection-Grouping-Detached Criteria

public List<Staffing> upcoming(){

         List<Staffing> staffing = new ArrayList<Staffing>();

        Criteria criteria = getCriteria();
        criteria.add(Restrictions.isNotNull("startDate")).add(Restrictions.le("startDate", new Date()));
        criteria.add(Restrictions.isNotNull("endDate")).add(Restrictions.ge("endDate", new Date()));
        criteria.add(Restrictions.eq("softDelete", false));
        criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("user")));
        DetachedCriteria maxDateQuery = DetachedCriteria.forClass(Employee.class);
        maxDateQuery.add(Restrictions.in("user",criteria.list() ));
        maxDateQuery.setProjection(Projections.max("endDate"));

        staffing = criteria.list();
        return staffing;
    }

我在这里尝试获取人员配置列表,但我得到的是对象数组列表,不确定哪里出了问题,但我觉得投影有问题。我正在尝试的是根据最大结束日期获取用户及其其他描述。

我有一个 class Staffing.java 有一个 varibale Employee 用户(Employee 是另一个 class)...Date endDate.... Date startDate, Boolean softDelete ... ..String projectName...我想获取具有最大 endDate 的用户的人员配置列表....就像用户可能有许多具有 endDate 的项目..我想获取每个用户具有最大 endDate 的列表

这是我的人员配置class

public class Staffing extends BaseObject {

    /** The Constant serialVersionUID. */
    private static final long serialVersionUID = -3254731507746702368L;

    /** The id. */
    private Long id;

    /** The start date. */
    private Date startDate;

    /** The end date. */
    private Date endDate;

    /** The user. */
    private Employee user;

    /** The project. */
    private Project project;

    /**
     * isDelete for soft delete of staffing.
     */
    private boolean softDelete;


}

这是员工 class

public class Employee extends BaseObject implements Serializable,
        Comparable<Employee>, IAuditLog {


    /**
     * id
     */
    private Long id;

    /**
     * username is required field
     */
    private String username;
    /**
     * password is required field
     */
    private String password;

    /**
     * firstname is required field
     */
    private String firstName;

    /**
     * lastname is required field
     */
    private String lastName;

    /**
     * personal Email is required field
     */
    private String email;

    /**
     * primary phone number
     */
    private String phoneNumber;

    /**
     * permanent Address
     */
    private Address permanentAddress;


    /**
     * gender is required field
     */
    private char gender;

    /**
     * Date of birth is required field
     */
    private Date DOB;



}

因此您可以使用此方法为一名员工获取 endDate 的最大值。

然后您可以使用循环对员工列表执行相同的操作。

所以我现在的方法是:

public List<Staffing> upcoming(Employee User){

         List<Staffing> staffing = new ArrayList<Staffing>();

        Criteria criteria = getCriteria();
        criteria.add(Restrictions.isNotNull("startDate"))
        .add(Restrictions.le("startDate", new Date()));
        criteria.add(Restrictions.isNotNull("endDate"))
        .add(Restrictions.ge("endDate", new Date()));
        criteria.add(Restrictions.eq("softDelete", false));
        criteria.add(Restrictions.eq("user", User));
        criteria.setProjection(Projections.max("endDate"));
        staffing = criteria.list();
        return staffing;
    } 

然后我们得到所有员工的列表:

public List<Employee> allEmployees(){

             List<Employee> employees= new ArrayList<Employee>();

            Criteria criteria = getCriteria();
              employees= criteria.list();
            Set<Domaine> employeesLLC = new HashSet<>();
        employeesLLC .addAll(employees);
        employees.clear();
        employees.addAll(employeesLLC );
        return employees;
        } 

并将第一种方法应用于您的每位员工。

我找到了这个查询的解决方案

List<Staffing> staffing = null;
        SimpleDateFormat df = new SimpleDateFormat("yyyy MM dd");
        String dateString = df.format(duration);

        Date date = df.parse(dateString);
        DetachedCriteria maxDate=DetachedCriteria.forClass(Staffing.class);
        maxDate.add(Restrictions.eq("softDelete", false));
        maxDate.setProjection(Projections.projectionList().add(Projections.groupProperty("user").as("user")).add(Projections.max("endDate"),"maxDate"));
        Criteria criteria = getCriteria();

        criteria.add(Restrictions.isNotNull("startDate")).add(Restrictions.le("startDate", new Date()));
        criteria.add(Restrictions.isNotNull("endDate")).add(Restrictions.ge("endDate", new Date())).add(Restrictions.le("endDate", date));
        criteria.add(Restrictions.eq("softDelete", false));
        criteria.add(Subqueries.propertiesIn(new String[]{"user","endDate"}, maxDate));
        staffing = criteria.list();
        return staffing;