Heb je het gebruik van Specificaties ?
Met behulp van specificaties kunt u dynamisch de WHERE
. genereren onderdeel van een lentegegevensquery. Om specificaties te gebruiken met uw lentegegevens JPA-query's, moet u de org.springframework.data.jpa.repository.JpaSpecificationExecutor
uitbreiden koppel. Uw gebruikersrepository kan er dus als volgt uitzien:
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}
Uw zoekmethode zou er zo uit kunnen zien
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);
}
Eerst beginnen we met het toevoegen van de name LIKE %text%
deel van de waar-uitdrukking.
Vervolgens controleren we of de waarde van de text
variabele kan worden gecast naar long
. Als het kan, halen we de lange waarde uit de tekenreeks en voegen deze toe aan de waar-query.
Als laatste controleren we of de text
variabele kan naar boolean worden gecast. Als het kan, voegen we die controle ook toe aan de vraag.
Als bijvoorbeeld de waarde van de text
variabele is test1 het waar-gedeelte zal zijn
WHERE name LIKE '%test1%;
Als de waarde van de text
variabele is waar dan zal het waar-gedeelte zijn
WHERE name LIKE '%true%' OR is_active = true;
Ten slotte, als de waarde van de text
variabele is 12 dan zal het waar-gedeelte zijn
WHERE name LIKE '%12%' OR id = 12;
Opmerking: Ik heb cb.lower(root.get("name"))
. toegevoegd en text.toLowerCase()
naar het gedeelte wanneer we op naam zoeken om de zoekopdracht hoofdletterongevoelig te maken.