Search code examples
javaspringhibernate-criteria

Spring CriteriaBuilder ignore null values


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());
            }
        }

    ...

Solution

  • 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));