Condicional de la cláusula where en JPA criterios de consulta

Me estoy enfrentando un problema para JPA criterios de consulta. ¿Cómo puedo agregar varios cláusula where en mi Consulta de Criterios con if else…

Mi Requisito es:

CriteriaBuilder builder = getEm().getCriteriaBuilder();
CriteriaQuery<Object> query = builder.createQuery(Object.class);

//From
Root<EntityClass> entity= query.from(EntityClass.class);
//Select
query.multiselect(entity.get("id").get("col1"),entity.get("id").get("col2"));
//Where
Predicate p1 = builder.and(builder.equal(entity.get("col3"), value3));
Predicate p2 = builder.and(builder.equal(entity.get("col4"), value4));
Predicate p3 = builder.and(builder.equal(entity.get("col5"), value5));
if(someCondition1){
    query.where(p1);
}else if(someCondition2){
    query.where(p1);
}
query.where(p3);

En el código anterior la declaración de la consulta.donde(p3); sustituye a la anteriormente establecida condición de la cláusula where p1 y p2. Cuál es la alternativa que he encontrado es conjunción, como el de abajo

if(someCondition1){
    query.where(p1, p3);
}else if(someCondition2){
    query.where(p2, p3);
}else{
    query.where(p3);
}

Pero que no es un buen enfoque, porque cuando hay muchas if-else esto es muy malo para escribir la repetición de códigos. ¿Se puede tener una solución para esto?

OriginalEl autor gahlot.jaggs | 2012-12-31

2 Kommentare

  1. 18

    Puede crear un Predicado matriz para almacenar condicional Predicados y, a continuación, agregarlo a la cláusula where:

    List<Predicate> predList = new LinkedList<Predicate>();
    if(someCondition1){
        predList.add(p1);
    }else if(someCondition2){
        predList.add(p2);
    }
    predList.add(p3);
    Predicate[] predArray = new Predicate[predList.size()];
    predList.toArray(predArray);
    query.where(predArray);

    Esto permite agregar dinámicamente cualquier tipo de predicado.

    Pero hay todavía un montón de if/else
    Aquí , Cómo podemos agregar, Y condicionalmente ? Podemos utilizar el mismo enfoque mediante la especificación de una lista de predicados ?

    OriginalEl autor jmendiola

  2. 7

    Algo como esto:

    Predicate p;
    Predicate p3 = builder.equal(entity.get("col5"), value5);
    if(someCondition1){
        p = builder.equal(entity.get("col3"), value3);
    }else if(someCondition2){
        p = builder.equal(entity.get("col4"), value4);
    }
    if (p != null) p = builder.and(p, p3);
    else p = p3;
    query.where(p);

    Así que no te llame donde en cada si sólo construir una expresión completa y donde una vez al final.

    Enfoque agradable gracias!

    OriginalEl autor Eelke

Kommentieren Sie den Artikel

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

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...