Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用CriteriaBuilder筛选数据以将枚举值与不起作用的文字进行比较_Java_Enums_Jpa - Fatal编程技术网

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

Java 使用CriteriaBuilder筛选数据以将枚举值与不起作用的文字进行比较,java,enums,jpa,Java,Enums,Jpa,我有一个带有枚举字段的java类 org.example.Importacion { ... @Enumerated(EnumType.STRING) private EstadoImportacion estadoImportacion; public static enum EstadoImportacion { NOT_VALID, IMPORTED, ERROR, VALID } } 当我使用CriteriaBuilder创建一个查询并尝试比较枚举值(从过滤

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

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

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

}
当我使用CriteriaBuilder创建一个查询并尝试比较枚举值(从过滤器到使用文本的CriteriaBuilder)时,查询的最终结果不会过滤枚举值,因此如果我向迭代器方法发送org.example.Importacion.EstadoImportacion.ERROR,重新结果不会筛选最终结果列表上的错误

companyCode过滤正常,因此如果我将“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;
}
公共迭代器迭代器(
首先,
长计数,
字符串公司代码,
org.example.Importacion.estadoimportacionestado){
CriteriaBuilder cb=getEntityManager().getCriteriaBuilder();
CriteriaQuery criteria=cb.createQuery(Importacion.class);
Root desembolso=criteria.from(Importacion.class);
标准。选择(desembolso);
谓词p=cb.conjunction();
如果(公司代码!=null){
p=cb.和(p,cb.相等(desembolso.get(“codigo”),companyCod));
//这部分很好用!
}
if(estado!=null){
表达式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));
//似乎不比较枚举值
}
标准。其中(p);
javax.persistence.Query Query=em.createQuery(条件);
setMaxResults((int)count+(int)first+1);
query.setFirstResult((int)first);
List resultList=query.getResultList();
迭代器迭代器=(迭代器)resultList.Iterator();
info(“desembolso size:{}”,resultList.size());
返回迭代器;
}

您的条件将文本与枚举进行比较。那不是你想要的。要将导入的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));
}