Reputation: 43
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 can be null (the end is infinitely in the future) how i can add this condition?
Thanks,
Upvotes: 4
Views: 22139
Reputation: 1
This should be self explanatory:
@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;
}
Upvotes: -2
Reputation: 16273
I would split the date comparison in two blocks, and test if outservicedate
isNull(). Something like:
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);
Upvotes: 14