JPA CriteriaSepcification IN子句

时间:2020-08-06 08:09:46

标签: spring-boot hibernate jpa jpa-criteria

我将SpringBoot 2.2.6JPA一起使用,并且需要使用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[]数组,但是它不起作用。你能帮我吗?

谢谢大家。

更新

如果我尝试将QueryList<String>相同,它将起作用!使用Integer,我会遇到此错误:

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

2 个答案:

答案 0 :(得分:0)

我已经解决了以下问题:

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

我不知道为什么使用List<String>时不需要投射。 希望有帮助。

答案 1 :(得分:0)

对于in子句,我们需要始终传递一个列表。

您需要使用Integer arrayInteger 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));
    }
}

在日食中,我们将得到警告,就像我们通过数组一样

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.