sql >> Base de Datos >  >> RDS >> Mysql

Cadena de búsqueda JPA, larga y booleana

¿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;

Nota: Agregué 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.