使用CriteriaBuilder过滤数据以将枚举值与不起作用的文字进行比较

时间:2015-05-04 16:09:46

标签: java enums jpa

我有一个带枚举字段的java类,

org.example.Importacion {
...
@Enumerated(EnumType.STRING)
  private EstadoImportacion estadoImportacion;

  public static enum EstadoImportacion {
      NOT_VALID, IMPORTED, ERROR, VALID
  }

}

当我使用CriteriaBuilder创建一个Query时,我尝试比较枚举值,一个从过滤器到使用文字的criteriabuilder,查询的最终结果不会过滤枚举值,所以如果我发送org.example。将importacion.EstadoImportacion.ERROR导入到迭代器方法,rersult不会在filnal结果列表中过滤ERROR。

companyCod过滤器好了,所以如果我发送" COMPANY001"作为companyCode,querybuilder过滤最终结果。

我想知道如何比较查询中的枚举:

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

1 个答案:

答案 0 :(得分:1)

您的标准会将文字与枚举进行比较。这不是你想要的。您想要将Importacion的estadoImportacion与给定的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));
}