2013-03-25 179 views
4
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(); 

這裏outService日期爲空爲空之間(到底是無限的未來) 我怎麼可以添加此條件?JPA找到實體,其中日期開始和結束日期,可使用標準

感謝,

回答

11

我會分裂,如果outservicedateisNull()在兩個街區的日期比較和測試。喜歡的東西:

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; 
       }