I create a CriteriaBuilder
for my GeoMaps. But these criterias are not required and can get the value null. I try to build with a if cases different searchstatements but i think its not the best way.
Is there a better way to say my CriteriaBuilder if the value is null you should ignore this on the search?
Filter Example:
UserSpecification specName =
new UserSpecification(new SearchCriteria("name", ":", data.getName()));
UserSpecification specEnv =
new UserSpecification(new SearchCriteria("env", ":", data.getEnv()));
...
if(data.getEnv().isEmpty()){
List list = gisMapRepository.findAll(Specification.where(specName));
}
Userspecification.java:
public class UserSpecification implements Specification<GeoMap> {
private SearchCriteria criteria;
public UserSpecification(SearchCriteria criteria) {
this.criteria = criteria;
}
@Override
public Predicate toPredicate
(Root<GeoMap> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
if (criteria.getOperation().equalsIgnoreCase(":")) {
if (root.get(criteria.getKey()).getJavaType() == String.class) {
return builder.like(
root.<String>get(criteria.getKey()), "%" + criteria.getValue() + "%");
} else {
return builder.equal(root.get(criteria.getKey()), criteria.getValue());
}
}
...
public class UserSpecification implements Specification<GeoMap> {
private SearchCriteria criteria;
public UserSpecification(SearchCriteria criteria) {
this.criteria = criteria;
}
@Override
public Predicate toPredicate
(Root<GeoMap> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
if (criteria.isEmpty()) return null;
//.. search something
}
}
Then
UserSpecification specName =
new UserSpecification(new SearchCriteria("name", ":", data.getName()));
UserSpecification specEnv =
new UserSpecification(new SearchCriteria("env", ":", data.getEnv()));
...
List list = gisMapRepository.findAll(Specification.where(specName).and(specEnv));