我想建立一个查询,在不同的实体上搜索日期。我的结构是:

  • 合同具有日期(不可为空)
  • 员工有日期(不可为空)
  • 员工可能有合同ID(可空)

  • 如果某个员工有合同,我想获取合同日期。如果员工没有合同,那么我想返回员工日期。

    到目前为止,我的代码是:
    if (inputDate!= null) {
        ParameterExpression<Date> exp = criteriaBuilder.parameter(Date.class, "inputDate");
        criteria.add(criteriaBuilder.or(
            criteriaBuilder.isNull(employee.get("contract")),
            criteriaBuilder.lessThanOrEqualTo(employee.<Date>get("creationDate"), exp),   criteriaBuilder.lessThanOrEqualTo((employee.join("contract").<Date>get("fromDate")), exp) ));}
    

    不过,这似乎不起作用。我总是似乎进入我所不期望的isNull。

    我很乐意对此进行更多研究,但我想我的问题是这是否是正确的解决方法。是吗?我在criteriaBuilder中也看到了selectCase,所以也许这可能是一个更好的解决方案。

    任何指针将被极大地接收。

    谢谢

    最佳答案

    这是一个解决方案,不确定是否可行,但我们将在您的帮助下设法使其正常工作:):

    ParameterExpression<Date> inputDateExp = criteriaBuilder.parameter(Date.class, "inputDate");
    Predicate employeeCreationDate = criteriaBuilder.lessThanOrEqualTo(
            employee.<Date>get("creationDate"), inputDateExp);
    Predicate contractStartDate = criteriaBuilder.lessThanOrEqualTo(
            employee.join("contract").<Date>get("fromDate"), inputDateExp);
    
    criteria.add(
            criteriaBuilder.selectCase().when(employee.get("contract").isNull(), employeeCreationDate).otherwise(contractStartDate));
    

    我不明白为什么使用“inputDate”作为表达式而不是日期?另外,我建议将criteria重命名为c并将criteriaBuilder重命名为cb,这样可以节省空间,并且我认为它更舒适。

    08-26 06:51