我将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]
答案 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 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));
}
}
在日食中,我们将得到警告,就像我们通过数组一样
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.