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.