Mysql
 sql >> Database >  >> RDS >> Mysql

Ricerca JPA Stringa, Lunga e Booleana

Hai considerato l'utilizzo di Specifiche ?

Utilizzando le specifiche, puoi generare dinamicamente il WHERE parte di una query sui dati primaverili. Per utilizzare le specifiche con le query JPA sui dati primaverili, dovrai estendere org.springframework.data.jpa.repository.JpaSpecificationExecutor interfaccia. Quindi il tuo repository utente potrebbe assomigliare a questo:

public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}

Il tuo metodo di ricerca potrebbe essere simile a questo

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

}

Per prima cosa iniziamo aggiungendo il name LIKE %text% parte dell'espressione where.

Successivamente, controlliamo se il valore del text la variabile può essere convertita in long . Se è possibile, otteniamo il valore lungo dalla stringa e lo aggiungiamo alla query where.

Infine controlliamo se il text la variabile può essere convertita in booleana. Se possibile, aggiungiamo anche quel controllo alla query.

Ad esempio, se il valore del text la variabile è test1 la parte dove sarà

WHERE name LIKE '%test1%;

Se il valore del text la variabile è vera quindi la parte dove sarà

WHERE name LIKE '%true%' OR is_active = true;

Infine, se il valore del text la variabile è 12 quindi la parte dove sarà

WHERE name LIKE '%12%' OR id = 12;

Nota: Ho aggiunto cb.lower(root.get("name")) e text.toLowerCase() alla parte in cui eseguiamo la ricerca per nome per rendere la ricerca insensibile alle maiuscole e minuscole.