sql >> Databasteknik >  >> RDS >> Mysql

JPA-sökning String, Long och Boolean

Har du övervägt att använda Specifikationer ?

Med hjälp av specifikationer kan du dynamiskt generera WHERE del av en fjäderdatafråga. För att kunna använda specifikationer med dina JPA-frågor med fjäderdata måste du utöka org.springframework.data.jpa.repository.JpaSpecificationExecutor gränssnitt. Så ditt användarförråd kan se ut så här:

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

Din sökmetod kan se ut så här

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

}

Först börjar vi med att lägga till name LIKE %text% del av where-uttrycket.

Därefter kontrollerar vi om värdet på text variabel kan castas till long . Om det kan får vi ut det långa värdet ur strängen och lägger till det i where-frågan.

Sist kontrollerar vi om text variabel kan gjutas till boolesk. Om det kan, lägger vi till den kryssrutan i frågan också.

Till exempel om värdet på text variabeln är test1 var-delen kommer att vara

WHERE name LIKE '%test1%;

Om värdet på text variabeln är true då blir var-delen

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

Slutligen, om värdet på text variabeln är 12 då blir var-delen

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

Obs! Jag lade till cb.lower(root.get("name")) och text.toLowerCase() till den del när vi söker på namn för att göra sökningen okänslig för skiftlägen.




  1. Databasen finns inte med laravel

  2. Lägg till saknad månad i sökresultatet

  3. Oracle SQL - ansluter till syntax/sökord

  4. Vänta händelse:ändra storlek på asynkron deskriptor