Válido también para operaciones FundeWeb v1.5. |
Hasta ahora, en las consultas que usaban filtros dinámicos, usadas generalmente para las tablas lazy, solo se podía usar un tipo de operador lógico al añadir las restricciones. Es decir, o todas las restricciones en el where usaban AND o todas OR, y no se podían mezclar. Ahora, con la nueva funcionalidad, podemos mezclar diferentes operadores lógicos en las restricciones del where,
Lo primero que tenemos que hacer es añadir en la implementación del DAS o en la clase donde se definen las restricciones:
import static es.um.atica.seam.framework.Query.LOGIC_OPERATOR_AND; import static es.um.atica.seam.framework.Query.LOGIC_OPERATOR_OR; import es.um.atica.seam.framework.QueryRestriction; |
Las restricciones la podemos definir como QueryRestriction[] o como List<QueryRestriction>. Este ultimo es el tipo se suele usa como parámetro en los métodos a utilizar o en la propia definición de las restricciones. Veamos un ejemplo:
QueryRestriction[] restriction = {
new QueryRestriction("cursoAcademico in :cursos", LOGIC_OPERATOR_AND),
new QueryRestriction("tipoCurso in :tipos", LOGIC_OPERATOR_OR)
}; |
Y al invocar al DAS, debemos utilizar los métodos que tienen nombre resultsByXXXXXWithDinamicRestrictionFilter(). Que tienen un parámetro del tipo List<QueryRestriction>. Veamos un ejemplo:
@Override
public ResultQuery<CasiopeaCurso> buscar( int firstResult, Integer resultLimit, List<QueryRestriction> restrictions, Map<String, Object> parameters, String sortField, String sortOrder ) {
return super.resultsByEntityQueryWithDinamicRestrictionFilter( restrictions, parameters, firstResult, resultLimit, sortField, sortOrder, null );
} |
Al componer la consulta, si hay más de una restricción en el where, la restricción se añadir comenzando con el operador lógico definido. Ejemplo:
select ent from MiEntidad ent where cursoAcademico in :cursos or tipoCurso in :tipos |
Como siempre el orden de aplicación de las restricciones, es el orden con que se definan en el array o la lista.