Haben Sie die Verwendung von Spezifikationen ?
Unter Verwendung von Spezifikationen können Sie das WHERE
dynamisch generieren Teil einer Federdatenabfrage. Um Spezifikationen mit Ihren Federdaten-JPA-Abfragen zu verwenden, müssen Sie org.springframework.data.jpa.repository.JpaSpecificationExecutor
erweitern Schnittstelle. Ihr Benutzer-Repository könnte also so aussehen:
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}
Ihre Suchmethode könnte so aussehen
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);
}
Zuerst fügen wir den name LIKE %text%
hinzu Teil des Where-Ausdrucks.
Als nächstes prüfen wir, ob der Wert von text
Variable kann in long
umgewandelt werden . Wenn dies möglich ist, holen wir den langen Wert aus der Zeichenfolge und fügen ihn der Where-Abfrage hinzu.
Zuletzt prüfen wir, ob der text
Variable kann in boolean umgewandelt werden. Wenn dies möglich ist, fügen wir diese Überprüfung auch der Abfrage hinzu.
Wenn beispielsweise der Wert von text
Variable ist test1 der wo Teil sein wird
WHERE name LIKE '%test1%;
Wenn der Wert des text
Variable ist true dann wird der wo Teil sein
WHERE name LIKE '%true%' OR is_active = true;
Schließlich, wenn der Wert des text
Variable ist 12 dann wird der wo Teil sein
WHERE name LIKE '%12%' OR id = 12;
Hinweis: Ich habe cb.lower(root.get("name"))
hinzugefügt und text.toLowerCase()
zu dem Teil, wenn wir nach Namen suchen, um die Groß- und Kleinschreibung zu ignorieren.