Case Insensitive Search Using Predicate and Criteria APIs

Currently, I have implemented a dynamic query builder that works great if my query conditions are spelled correctly. Since this may not always be the case, I need a solution that is flexible enough to accept any changes to this condition, primarily to maintain case insensitivity.

The current specification for method override code using a method is as follows:

final List<Predicate> predicates = new ArrayList<Predicate>();

    Path<String> username = root.get("username");
    Path<String> agentCode = root.get("agentCode");
    Path<EntityStatus> status = root.get("status");
    Path<String> firstname = root.get("firstName");
    Path<String> lastname = root.get("lastName");
    Path<String> email = root.get("eMail");


if(criteria.getUsername()!=null && !criteria.getUsername().isEmpty()) {
      predicates.add(cb.equal(username, criteria.getUsername()));
    }

    if(criteria.getAgentCode()!=null && !criteria.getAgentCode().isEmpty()) {
      predicates.add(cb.equal(agentCode, criteria.getAgentCode()));
    }

    if(criteria.getFirstName()!=null && !criteria.getFirstName().isEmpty()) {
      predicates.add(cb.like(firstname, "%"+criteria.getFirstName()+"%"));
    }

    if(criteria.getLastName()!=null && !criteria.getLastName().isEmpty()) {
      predicates.add(cb.equal(lastname, criteria.getLastName()));
    }

    if(criteria.getEMail()!=null && !criteria.getEMail().isEmpty()) {
      predicates.add(cb.equal(email, criteria.getEMail()));
    }

    if(criteria.getStatus()!=null) {
      predicates.add(cb.equal(status, criteria.getStatus()));
    }

    return cb.and(predicates.toArray(new Predicate[predicates.size()]));
  }

And my repository interface, which is called from the service level, is as follows.

public interface UserRepo extends PagingAndSortingRepository<User, Long> {
     List<User> findAll(Specification spec);
}

thanks for the help

+4
source share
2 answers

equalsIgnoreCase().

, , . , , toLowerCase(), .

predicates.add(cb.equal(email.toLowerCase(), criteria.getEMail().toLowerCase()));

: JavaEE CriteriaBuilder lower(), .

+1

@Nikolas Charalambidis, , . predacate.add(). , , .

predicates.add(cb.like(cb.lower(email), "%"+criteria.getEMail().toLowerCase()+"%"));
+1

Source: https://habr.com/ru/post/1685859/


All Articles