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.