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));
}
Related videos on Youtube
Comments
-
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; }