Mysql
 sql >> Datenbank >  >> RDS >> Mysql

JPA-Suchzeichenfolge, Long und Boolean

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.