我想将参数表达式用作in子句的一部分。我想查询在一组Bar中具有Bar的Foos列表。这可能吗?
Foo // Join, ManyToOne Bar getBar() Query ParameterExpression<???> barParameter; void setup() { CriteriaBuilder builder = ... CriteriaQuery<Foo> criteria = ... Root<Bar> root = ... barParameter = builder.parameter(???); criteria.where( builder.in(root.get(Foo_.bar)).value(barParameter) ); } List<Foo> query(Set<Bar> bars) { TypedQuery<Foo> query = createQuery(); query.setParameter(barParameter, bars); return query.getResultList(); }
使用in表达式时,您只能使用基本比较类型,因此您需要进行联接并比较基本类型的字段(在此我已经使用过Integer id):
in
Integer id
Root<Foo> foo = cq.from(Foo.class); Join<Foo, Bar> bar = foo.join(Foo_.bar); ParameterExpression<Collection> bars = cb.parameter(Collection.class); cq.where(bar.get(Bar_.id).in(bars)); TypedQuery<Foo> tq = em.createQuery(cq); Collection<Integer> barsParameter = new ArrayList<Integer> (); barsParameter.add(1); List<Foo> resultList = tq.setParameter(bars, barsParameter).getResultList();