Czy rozważałeś użycie Specyfikacje ?
Korzystając ze specyfikacji, możesz dynamicznie generować WHERE
część zapytania dotyczącego danych wiosennych. Aby użyć specyfikacji w zapytaniach JPA dotyczących danych wiosennych, musisz rozszerzyć org.springframework.data.jpa.repository.JpaSpecificationExecutor
interfejs. Twoje repozytorium użytkowników może wyglądać tak:
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}
Twoja metoda wyszukiwania może wyglądać tak
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);
}
Najpierw zaczynamy od dodania name LIKE %text%
część wyrażenia where.
Następnie sprawdzamy, czy wartość text
zmienna może być rzutowana na long
. Jeśli to możliwe, pobieramy długą wartość z ciągu i dodajemy ją do zapytania where.
Na koniec sprawdzamy, czy text
zmienna może być rzutowana na wartość logiczną. Jeśli to możliwe, dodajemy również ten czek do zapytania.
Na przykład, jeśli wartość text
zmienna to test1 gdzie będzie część
WHERE name LIKE '%test1%;
Jeśli wartość text
zmienna jest prawda to gdzie będzie część
WHERE name LIKE '%true%' OR is_active = true;
Wreszcie, jeśli wartość text
zmienna to 12 to gdzie będzie część
WHERE name LIKE '%12%' OR id = 12;
Uwaga: Dodałem cb.lower(root.get("name"))
i text.toLowerCase()
do części, w której szukamy według nazwy, aby nie uwzględniać wielkości liter.