【问题标题】:JPA find entities where date is between start and end date that can be null using CriteriaJPA 使用 Criteria 查找日期在开始日期和结束日期之间可以为空的实体
【发布时间】:2013-03-25 07:57:46
【问题描述】:
CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery cQuery = builder.createQuery();
    Root<AcsTemplateDateJPA> root = cQuery.from(AcsTemplateDateJPA.class);
    ParameterExpression<Date> d = builder.parameter(Date.class);
    cQuery.where(builder.between(d, root.<Date>get("inservicedate"), root.<Date>get("outservicedate"))); 
    Query query = em.createQuery(cQuery.select(root.get("acstemplateid"))).setParameter(d, planDate, TemporalType.DATE);
    List results =query.getResultList(); 

here outService date 可以为null(结束无限在未来) 如何添加这个条件?

谢谢,

【问题讨论】:

    标签: jpa criteria-api


    【解决方案1】:

    我会将日期比较分成两个块,并测试 outservicedate isNull()。比如:

    Predicate startPredicate = builder.greaterThanOrEqualTo(root.<Date>get("inservicedate"), d);
    Path<Date> outServiceDate = root.<Date>get("outservicedate");
    Predicate endPredicate = builder.or(builder.isNull(outServiceDate), builder.lessThanOrEqualTo(outServiceDate, d));
    Predicate finalCondition = builder.and(startPredicate, endPredicate);
    

    【讨论】:

      【解决方案2】:

      这应该是不言自明的:

                      @Override
                      public Predicate toPredicate( Root<OrganizationCommission> root, CriteriaQuery<?> query,
                                                    CriteriaBuilder cb )
                      {
                          // The predicate validFrom - the column should contains null or values less than validityDate
                          Predicate validFrom = cb.or( root.get( OrganizationCommission_.validFrom ).isNull(),
                                                       cb.lessThanOrEqualTo(
                                                               root.get( OrganizationCommission_.validFrom ),
                                                               validityDate ) );
                          // The predicate validTo - the column should contains null or values greater than validityDate
                          Predicate validTo = cb.or( root.get( OrganizationCommission_.validTo ).isNull(),
                                                     cb.greaterThanOrEqualTo( root.get( OrganizationCommission_.validTo ),
                                                                              validityDate ) );
                          Predicate predicate = cb.conjunction();
                          predicate.getExpressions().add( cb.and( validFrom, validTo ) );
                          return predicate;
                      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-05
        • 1970-01-01
        相关资源
        最近更新 更多