【问题标题】:Spring JPA Specifications Not In QuerySpring JPA 规范不在查询中
【发布时间】:2017-03-14 09:34:33
【问题描述】:

这里使用 Spring JPA 规范的 IN 标准查询工作正常。但我不知道如何使用“NOT IN”..

那么我如何使用 Spring JPA 规范使用 NOT IN 条件查询。

SearchSpecification<User> spec = new CommonSpecification<Case>(new SearchCriteria("client.id", Operator.NOT_IN, clientIdList));

@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
    Predicate predicate = null;
    switch (searchCriteria.getOperator()) {

    case IN:
        if (searchCriteria.getValue() instanceof List<?>) {
            predicate = getFieldPath(searchCriteria.getKey(), root)
                    .in(((List<?>) searchCriteria.getValue()).toArray());
        }
        break;
    case NOT_IN:
        //What to do???
        break;
    default:
        break;

    }
    return predicate;
}


private Path<Object> getFieldPath(String key, Root<T> root) {
    Path<Object> fieldPath = null;
    if (key.contains(".")) {
        String[] fields = key.split("\\.");
        for (String field : fields) {
            if (fieldPath == null) {
                fieldPath = root.get(field);
            } else {
                fieldPath = fieldPath.get(field);
            }
        }
    } else {
        fieldPath = root.get(key);
    }
    return fieldPath;
}

【问题讨论】:

    标签: spring spring-data-jpa jpa-2.1


    【解决方案1】:

    这个功能也很好用..

    case NOT_IN:
    if (searchCriteria.getValue() instanceof List<?>) {
        predicate = criteriaBuilder.not(getFieldPath(searchCriteria.getKey(), root).in(((List<?>) searchCriteria.getValue()).toArray()));
    }
    break;
    

    【讨论】:

      【解决方案2】:

      使用Predicate.not() 方法;代码与IN的情况相同,只需添加.not()

      case NOT_IN:
          if (searchCriteria.getValue() instanceof List<?>) {
              predicate = getFieldPath(searchCriteria.getKey(), root)
                      .in(((List<?>) searchCriteria.getValue()).toArray())
                      .not();
          }
          break;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        • 1970-01-01
        • 2023-02-19
        • 2012-10-14
        • 1970-01-01
        • 2017-10-25
        相关资源
        最近更新 更多