使用ParameterExpression作为In子句的一部分

时间:2012-08-07 12:24:47

标签: java hibernate jpa jpa-2.0

我想将参数表达式用作in子句的一部分。我想查询一个包含一组条形图中的条形图的Foo列表。这可能吗?

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

1 个答案:

答案 0 :(得分:5)

使用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();