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.