2012-08-07 31 views
0

我想使用参数表达式作为in子句的一部分。我想查询一系列酒吧中有酒吧的Foos列表。这可能吗?使用ParameterExpression作为In子句的一部分

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(); 
    } 
+0

这也许[链接](http://stackoverflow.com/a/11349052/870122)可以是有帮助的:它不是'ParameterExpression'S,但可能是一个起点... – perissf 2012-08-07 12:46:27

+0

我发现的一切(包括你的链接)有创建CriteriaQuery时in子句的实际数据。我一直在使用CriteriaQuery构建一次的模式,并使用参数表达式设置实际参数。我只是希望有一些简单的东西可以忽略使用ParameterExpression。 – 2012-08-07 15:19:43

回答

4

随着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();