【问题标题】:Projection-Grouping-Detached Criteria投影分组分离准则
【发布时间】:2018-03-15 16:56:24
【问题描述】:
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;
    }

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

我有一个类 Staffing.java 有一个变量 Employee 用户(Employee 是另一个类)...日期 endDate ....日期 startDate,布尔 softDelete .....String projectName ...我想获取列表具有最大 endDate 的用户的人员配备.. 像用户可能有许多具有 endDate 的项目.. 我想获取每个用户具有最大 endDate 的列表

这是我的人员配备课

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;


}

这是员工类

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;



}

【问题讨论】:

  • 你能不能更有表现力!你想做什么?
  • 我有一个类 Staffing.java 有一个变量 Employee 用户(Employee 是另一个类)...日期 endDate.... 日期 startDate, Boolean softDelete .....String projectName...我想获取具有最大 endDate 的用户的人员配置列表.. 就像用户可能有许多具有 endDate 的项目.. 我想获取每个用户具有最大 endDate 的列表

标签: hibernate criteria projection hibernate-criteria


【解决方案1】:

因此,您可以使用此方法为一个 Employee 获取 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;
        } 

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

【讨论】:

  • 给出此错误“无法解析属性:com.model.Employee 的 endDate;嵌套异常是 org.hibernate.QueryException:无法解析属性:com.model.Employee 的 endDate”
  • 能否请您发布您的两个类 Employee 和 Staffing !
  • 嗨,我已经编辑了我的帖子,现在它有两个类
【解决方案2】:

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

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2011-10-04
    • 2023-03-23
    • 2020-10-22
    • 1970-01-01
    相关资源
    最近更新 更多