Algo que no se especifica en la documentación de JPA de Hibernate >> es cómo construir las condiciones de una Criteria Query dinámicamente, por ejemplo, si dependiendo de si ciertos parámetros nos llegan o no nulos, los incluímos en la cláusula WHERE
En el fondo lo que hay que entender es que cada vez que con el CriteriaBuilder especificamos una condición builder.equal(, builder.and( etc, JPA está instanciando un objeto del tipo javax.persistence.criteria.Predicate, el cual podemos utilizar nosotros mismos:
List<Predicate> predicados = new ArrayList<Predicate>(); if(contrato!=null){ Predicate predicado = builder.equal(root.get(obj_.prop), param); predicados.add(predicado); }
y así sucesivamente… luego, pueden pasársele todos los predicados de uno a la query en forma de arreglo:
if(predicados.size()>0){ Predicate[] arreglo = new Predicate[predicados.size()]; for(int i=0; i<predicados.size(); i++){ //los pasamos a un arreglo para que el CB pueda leerlo arreglo[i] = predicados.get(i); } criteria.where(arreglo); //se pasan todos juntos }
ojo que probablemente hay una manera más elegante de lograr ésto, investigar Conjunctions…