2016-11-01 8 views
1

ここで、Spring JPA仕様を使用したIN条件クエリは正常に動作しています。 「NOT IN」を使用する方法はわかりません。Spring JPA仕様がクエリに含まれていない

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; 
} 

答えて

5

Predicate.not()メソッドを使用します。コードはIN場合と同じで、ただ.not()を追加します。

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

おかげで... –

0

この機能はまた、正常に動作します..それは私のための作品だ

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