java - 使用 Predicate 和 Criteria API 进行不区分大小写的搜索

标签 java sql spring string jpa

我目前已经实现了一个动态查询构建器,如果我的查询条件拼写正确,它就能完美运行。由于情况可能并非总是如此,我需要一个足够灵活的解决方案来应对条件的任何变化,主要支持不区分大小写。

当前规范的 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()]));
  }

从服务层调用的存储库接口(interface)如下所示。

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

最佳答案

正如@Nikolas Charalambidis 所建议的那样,我使用了适合我的具体实现的他的答案的变体。 答案只需要修改 predacate.add() 行。 有了这个答案,解决方案就足够灵活,可以支持不区分大小写和部分输入。

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

关于java - 使用 Predicate 和 Criteria API 进行不区分大小写的搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46275268/

相关文章:

java - 在 Java 中将一个 Optional<List<Object>> 转换为另一个 Optional<List<Object>>

java - 连接被拒绝与放心的 junit 测试用例

java - 使用ViewFlipper滑动数据库中存储的图像

java - 通过 Spring 使用 REST Web 服务

java - 如何删除 "Status and notification bar"?

javascript - JQuery动态for循环问题

sql - 从 XML 中提取值不适用于查询节点或值

具有多个 WHERE(关系)条件的 SQL UPDATE

java - 从数据库 hibernate hql 检索记录时出现空指针异常

java - spring-jdbc中一个连接可以同时被两个线程持有吗?