JPA encontrar entidades en donde se fecha entre la fecha de inicio y fin que puede ser nulo uso de Criterios

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(); 

aquí outService fecha puede ser null (el final es infinitamente en el futuro)
cómo puedo agregar esta condición?

Gracias,

OriginalEl autor user2190192 | 2013-03-25

2 Kommentare

  1. 11

    Yo dividiría a la fecha de comparación en dos bloques, y prueba si outservicedate isNull(). Algo así como:

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

    OriginalEl autor perissf

  2. -2

    Esto se explica por sí mismo:

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

    OriginalEl autor Nicu Jalba

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea