我目前已经实现了一个动态查询构建器,如果我的查询条件拼写正确,该构建器可以完美地工作。由于可能并非总是如此,因此我需要一个足够灵活的解决方案,以适应条件的任何变化,主要是支持不区分大小写。
当前规范的toPredicate方法覆盖代码如下所示:
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()])); }
从服务层调用的我的存储库接口如下所示。
public interface UserRepo extends PagingAndSortingRepository<User, Long> { List<User> findAll(Specification spec); }
谢谢您的帮助
通常,您可以使用equalsIgnoreCase()方法实现不区分大小写的功能。
但是,在这种情况下,您仅分析要比较的值,而没有实现比较本身。因此,您可以使用toLowerCase()方法以小写形式解析所有值,强制不区分大小写地比较它们。
predicates.add(cb.equal(email.toLowerCase(), criteria.getEMail().toLowerCase()));
编辑:我看了CriteriaBuilder的JavaEE文档,发现方法lower()可能会有所帮助。