sql >> Databáze >  >> RDS >> Mysql

JPA search String, Long a Boolean

Zvažovali jste použití Specifikace ?

Pomocí specifikací můžete dynamicky generovat WHERE součástí dotazu na jarní data. Chcete-li použít specifikace s dotazy JPA na jarní data, budete muset rozšířit org.springframework.data.jpa.repository.JpaSpecificationExecutor rozhraní. Vaše uživatelské úložiště by tedy mohlo vypadat takto:

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

Vaše metoda vyhledávání může vypadat takto

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

}

Nejprve začneme přidáním name LIKE %text% část výrazu where.

Dále zkontrolujeme, zda je hodnota text proměnnou lze přetypovat na long . Pokud je to možné, získáme z řetězce hodnotu long a přidáme ji do dotazu where.

Nakonec zkontrolujeme, zda text proměnnou lze přetypovat na booleovskou. Pokud je to možné, přidáme tuto kontrolu také do dotazu.

Například pokud je hodnota text proměnná je test1 část kde bude

WHERE name LIKE '%test1%;

Pokud je hodnota text proměnná je pravda pak část kde bude

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

Konečně, pokud je hodnota text proměnná je 12 pak část kde bude

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

Poznámka: Přidal jsem cb.lower(root.get("name")) a text.toLowerCase() na část, kdy hledáme podle jména, abychom nerozlišovali malá a velká písmena.




  1. požadavek postgresql přes několik schémat

  2. MySQL + Rails:errno:150 Omezení cizího klíče je nesprávně vytvořeno

  3. Jak zobrazit serverové řazení v MySQL

  4. Crystal Reports vs. Microsoft SQL Server Reporting Services