¿Ha considerado el uso de Especificaciones ?
Usando especificaciones, puede generar dinámicamente el WHERE
parte de una consulta de datos de primavera. Para usar especificaciones con sus consultas JPA de datos de primavera, tendrá que extender org.springframework.data.jpa.repository.JpaSpecificationExecutor
interfaz. Así que su repositorio de usuarios podría verse así:
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}
Su método de búsqueda podría verse así
public List<User> getAllFilterByString(String text) {
if(StringUtils.isEmpty(text))
return userRepository.findAll();
Specification<User> specification =
(root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.like(cb.lower(root.get("name")), "%"+text.toLowerCase()+"%"));
//check if the text value can be casted to long.
//if it is possible, then add the check to the query
try {
long longValue = Long.valueOf(text);
predicates.add(cb.equal(root.get("id"), longValue));
}
catch (NumberFormatException e) {
//do nothing, the text is not long
}
//check if the text can be casted to boolean
//if it is possible, then add the check to the query
Boolean value = "true".equalsIgnoreCase(text) ? Boolean.TRUE :
"false".equalsIgnoreCase(text) ? Boolean.FALSE : null;
if(value != null) {
predicates.add(cb.equal(root.get("isActive"), value));
}
return cb.or(predicates.toArray(new Predicate[] {}));
};
return userRepository.findAll(specification);
}
Primero comenzamos agregando el name LIKE %text%
parte de la expresión where.
A continuación, comprobamos si el valor del text
la variable se puede convertir a long
. Si es posible, obtenemos el valor largo de la cadena y lo agregamos a la consulta where.
Por último, comprobamos si el text
La variable se puede convertir a booleana. Si es posible, también agregamos esa verificación a la consulta.
Por ejemplo, si el valor del text
la variable es prueba1 la parte donde estará
WHERE name LIKE '%test1%;
Si el valor del text
la variable es verdadera entonces la parte where será
WHERE name LIKE '%true%' OR is_active = true;
Finalmente, si el valor del text
la variable es 12 entonces la parte where será
WHERE name LIKE '%12%' OR id = 12;
cb.lower(root.get("name"))
y text.toLowerCase()
a la parte cuando buscamos por nombre para que la búsqueda no distinga entre mayúsculas y minúsculas.