如果/ Case语句在JPA Criteria Builder中

时间:2012-04-19 20:44:39

标签: java jpa jpa-2.0 criteria-api

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

  • 合同有日期(不可为空)
  • 员工有日期(不可为空)
  • 员工可能有合同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,所以也许这可能是一个更好的解决方案。

任何指针都会受到极大的欢迎。

由于

2 个答案:

答案 0 :(得分:5)

这将是一个解决方案,不确定它是否有效,但我们会设法让它在你的帮助下工作:):

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”作为Expression而不是Date?另外,我建议将criteria重命名为c,将criteriaBuilder重命名为cb,这样可以节省空间,我觉得它更舒服。

答案 1 :(得分:1)

我认为您要做的是使用dt = c("TRAVEL AND UNSPECIFIED TIME USE", "TRAVEL BY PURPOSE", "Travel related to unspecified time use", "Travel related to personal business") dt = as.data.frame(dt) dt$dt = as.character(dt$dt) ,并仅将Case<Date>用作Predicate的第一个参数。 Case#whenCase<Date>,您希望将其传递到Expression<Date>

CriteriaQuery#multiselect