sql >> Database teknologi >  >> RDS >> Mysql

JPA-søgning String, Long og Boolean

Har du overvejet brugen af ​​Specifikationer ?

Ved hjælp af specifikationer kan du dynamisk generere WHERE del af en forårsdataforespørgsel. For at bruge specifikationer med dine forårsdata JPA-forespørgsler skal du udvide org.springframework.data.jpa.repository.JpaSpecificationExecutor interface. Så dit brugerlager kunne se sådan ud:

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

Din søgemetode kunne se sådan ud

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 starter vi med at tilføje name LIKE %text% del af where-udtrykket.

Dernæst tjekker vi om værdien af ​​text variabel kan castes til long . Hvis det kan, så får vi den lange værdi ud af strengen og tilføjer den til where-forespørgslen.

Sidst tjekker vi om text variabel kan castes til boolesk. Hvis det kan, så føjer vi også denne markering til forespørgslen.

For eksempel, hvis værdien af ​​text variabel er test1 hvor-delen vil være

WHERE name LIKE '%test1%;

Hvis værdien af ​​text variabel er sand så vil hvor-delen være

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

Endelig, hvis værdien af ​​text variabel er 12 så vil hvor-delen være

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

Bemærk: Jeg tilføjede cb.lower(root.get("name")) og text.toLowerCase() til den del, hvor vi søger efter navn for at gøre søgningen ufølsom.




  1. Sådan sikkerhedskopieres og gendannes en PostgreSQL-database

  2. Hvordan GROUP BY korrekt i MySQL?

  3. Valg af sidste post fra INNER JOIN og gruppering

  4. Database Design Spørgsmål - Kategorier / Underkategorier