Spring JPA规范中的"Not In"查询

11

使用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;
}
2个回答

25

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

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

1
这个功能也能正常工作。
case NOT_IN:
if (searchCriteria.getValue() instanceof List<?>) {
    predicate = criteriaBuilder.not(getFieldPath(searchCriteria.getKey(), root).in(((List<?>) searchCriteria.getValue()).toArray()));
}
break;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接