Filtering data with CriteriaBuilder to compare enum values with literals not working

10,518

Your criteria compares a literal with the enum. That's not what you want. You want to compare the Importacion's estadoImportacion with the given estado:

Predicate p = cb.conjunction();
if(companyCod != null) {
    p = cb.and(p, cb.equal(desembolso.get("codigo"), companyCod));
}
if (estado != null) {
    p = cb.and(p, cb.equal(desembolso.get("estadoImportacion"), estado));
}
Share:
10,518

Related videos on Youtube

nicoLinjava
Author by

nicoLinjava

Developer, passionate on all computer science things

Updated on June 27, 2022

Comments

  • nicoLinjava
    nicoLinjava almost 2 years

    I have a java class with a enum field,

    org.example.Importacion {
    ...
    @Enumerated(EnumType.STRING)
      private EstadoImportacion estadoImportacion;
    
      public static enum EstadoImportacion {
          NOT_VALID, IMPORTED, ERROR, VALID
      }
    
    }
    

    When I create a Query with CriteriaBuilder and I try to compare the enum values, one from a filter to the criteriabuilder using literals, the final result of the query does not filter the enum values, so if I send org.example.Importacion.EstadoImportacion.ERROR to the iterator method, the rersult will not filter ERROR on the filnal result list.

    The companyCod filters ok, so If I send "COMPANY001" as a companyCode, the querybuilder filters the final result.

    I would like to know how to compare enums in the query:

       public Iterator<Importacion> iterator (
         long first, 
         long count, 
         String companyCod, 
         org.example.Importacion.EstadoImportacion estado) {
    
        CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
        CriteriaQuery<Importacion> criteria = cb.createQuery(Importacion.class);
        Root<Importacion> desembolso = criteria.from(Importacion.class);
        criteria.select(desembolso);
        Predicate p = cb.conjunction();
        if(companyCod != null) {
    
            p = cb.and(p, cb.equal(desembolso.get("codigo"), companyCod));
            //This part works fine!
        }
    
    
        if (estado != null) {
            Expression<org.example.Importacion.EstadoImportacion> estadoImportacion = null;
    
            if (estado.equals(org.example.Importacion.EstadoImportacion.ERROR)) {
                estadoImportacion = cb.literal(org.example.Importacion.EstadoImportacion.ERROR);
            }
    
            if (estado.equals(org.example.Importacion.EstadoImportacion.IMPORTED)) {
                estadoImportacion = cb.literal(org.example.Importacion.EstadoImportacion.IMPORTED);
            }
    
            if (estado.equals(org.example.Importacion.EstadoImportacion.NOT_VALID)) {
                estadoImportacion = cb.literal(org.example.Importacion.EstadoImportacion.NOT_VALID);
            }
    
            if (estado.equals(org.example.Importacion.EstadoImportacion.VALID)) {
                estadoImportacion = cb.literal(org.example.Importacion.EstadoImportacion.VALID);
            }
    
            p = cb.and(p, cb.equal(estadoImportacion, cb.literal(estado)));
        //Doesn't seems to compare enum values
    
        }
    
        criteria.where(p);
        javax.persistence.Query query = em.createQuery(criteria);
    
        query.setMaxResults((int)count + (int)first + 1);
        query.setFirstResult((int)first);
        List resultList = query.getResultList();
        Iterator iterator = (Iterator) resultList.iterator();
        LOGGER.info("desembolso size: {}", resultList.size());
        return iterator;
    }
    

Related