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.