API de criterios JPA: iterar a través de la lista y crear predicados


Estoy tratando de migrar un proyecto iBatis al servicio de descanso usando Spring boot, Spring data JPA e Hibernate. Estoy atascado en una conversión de consulta, cualquier ayuda es apreciada. Esta es la consulta de iBatis que intento migrar.

<foreach item="item" collection="currentStatus">
    <choose>
        <when test="item in fStatusList">
            ((j_status_code != #{item}) AND (f_status_code = #{item}) AND
            (EXP_FLAG IS NULL OR EXP_FLAG ='F' ))
        </when>
        <when test="item in jStatusList">
            ((max_jsc.status_code = #{item}) AND
                <if test="item ==419">
                    EXP_FLAG='H'
                </if>
                <if test="item ==449">
                    EXP_FLAG='C'
                </if>
            </when>
        <otherwise>
            ((j_status_code = #{item}) AND (f_status_code_name is null))
        </otherwise>
    </choose>
</foreach>

Esto es lo que tengo hasta ahora.

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Job> cq = cb.createQuery(Job.class);
    Root<Job> job = cq.from(Job.class);
    List<Predicate> predicates = new ArrayList<>();
    for (int status : statusList) {
    if (IntStream.of(fStatusList()).anyMatch(x -> x == status)) {
        predicates.add(cb.equal(job.get("f_status_code"), status));
        predicates.add(
            cb.or(
                cb.isNull(job.get("EXP_FLAG")),
                cb.equal(
                    job.get("EXP_FLAG"),"F")));
      } else if (IntStream.of(jStatusList()).anyMatch(x -> x == status)) {
        predicates.add(cb.equal(job.get("jobStatusCode"), status));
        if (status == 10) {
          predicates.add(
              cb.equal(
                  job.get("EXP_FLAG"), "H"));
        } else if (status == 15) {
          predicates.add(
              cb.equal(
                  job.get("EXP_FLAG"), "C"));
        }
      } else {
        predicates.add(
            cb.and(
                cb.isNull(job.get("f_status_code")),
                cb.equal(job.get("j_status_code"), status)));
      }
}
    cq.where(predicates.toArray(new Predicate[0]));
    TypedQuery<Job> query = entityManager.createQuery(cq);

El problema es que la condición donde se está formando como a continuación. La iteración necesita agregar la condición OR, en lugar de AND para cada estado. Cómo puedo conseguir esto ?

where
 (
 job0_.f_status_code is null
 ) 
 and job0_.j_status_code=315 
 and job0_.j_status_code=449 
 and job0_.exp_flag=?

Además, avise si el uso de JPA Criteria API es la mejor opción en estos escenarios. Parecía bastante complicado e ilegible para algunas condiciones simples de iBatis. ¿Existe una mejor alternativa al usar Hibernate?

Respuesta 1

Estoy creando una aplicación de Android que conecta mi dispositivo a un chip integrado a través de Bluetooth. Estoy modelando mi diseño después de un programa que ya existe en Palm Pilot (escrito en C). Soy ...

Soy relativamente inexperto con CompletableFuture de Java y probablemente necesito ayuda con él. Esto es lo que estoy tratando de hacer. / * Quiero usar el resultado del futuro en un segundo. * Entonces ...

Soy nuevo en el entorno en desarrollo. Estoy usando el marco Struts para mi proyecto. Aquí pregunté desde DataBase y almacené la tabla resultante en ArrayList. Y muestro Arraylist en JSP. Ahora estoy obligado ...

Al igual que el título, quiero preguntar cómo agregar archivos PDF con el formulario de carga a mi carpeta de almacenamiento (por ejemplo: uploadData) y luego se agrega a la base de datos como un archivo también en JSP. Si no es posible, está bien agregar ...