投影分组分离标准
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;
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;