Предложение JPA CriteriaSepcification IN - PullRequest
0 голосов
/ 06 августа 2020

Я использую SpringBoot 2.2.6 с JPA, и мне нужно выполнить запрос с предложением IN, как указано в заголовке. Я попробовал:

@Override
public Predicate toPredicate(Root<Distinta> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
    
    List<Predicate> predicates = new ArrayList<>();
    .....
    .....
    for (DistintaCriteria criteria : list) {
        switch(criteria.getOperation()) {
        case TEST:
            Join<Entity, JoinEntity> join = root.join("joinEntity");
            predicates.add(join.<Integer>get("id").in(criteria.getValue()));
    }
}

, где criteria.getValue() - это массив Integer[], но он не работает. Вы можете мне помочь?

Всем спасибо.

ОБНОВЛЕНИЕ

Если я попробую то же самое Query с List<String>, все заработает! С Integer у меня была эта ошибка:

Unaware how to convert value [[2, 3, 4, 5] : java.util.ArrayList] to requested type [java.lang.Integer]

Ответы [ 2 ]

0 голосов
/ 13 августа 2020

Для предложения in нам нужно всегда передавать список.

Вам нужно преобразовать Integer array в Integer list, используя Java-8 как

List<Integer> values = Arrays.asList(criteria.getValue())

@Override
public Predicate toPredicate(Root<Distinta> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
    
    List<Predicate> predicates = new ArrayList<>();
    .....
    .....
    for (DistintaCriteria criteria : list) {
    
        List<Integer> values = Arrays.asList(criteria.getValue());
    
        switch(criteria.getOperation()) {
        case TEST:
            Join<Entity, JoinEntity> join = root.join("joinEntity");
            predicates.add(join.<Integer>get("id").in(values));
    }
}

В eclipse мы получим предупреждение, как если бы мы передали массив

Type Integer[] of the last argument to a method in(Object...) doesn't exactly match the vararg parameter type. Cast to Object[] to confirm the non-varargs invocation, or pass individual arguments of type Object for a varargs invocation.

0 голосов
/ 07 августа 2020

Я решил следующее:

Join<Entity, JoinEntity> join = root.join("joinEntity");
Predicate in = join.get("id").in((List<Integer>)criteria.getValue());
predicates.add(in);

Я не знаю, почему с List<String> мне не нужно кастовать. Надежда помогает.

...