2012-08-07 28 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();