使用ParameterExpression作为In子句的一部分 [英] Using a ParameterExpression as part of the In clause

查看:211
本文介绍了使用ParameterExpression作为In子句的一部分的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  Foo 
// Join,ManyToOne
Bar getBar()

查询
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)
);
}

列表< Foo> query(Set< Bar> bars){
TypedQuery< Foo> query = createQuery();
query.setParameter(barParameter,bars);
返回query.getResultList();


解决方案 < > in 表达式中只能使用原始比较类型,所以你需要建立一个连接并比较一个原始类型的字段(这里我使用了 Integer id

 根< Foo> foo = cq.from(Foo.class); 
加入< 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);
集合<整数> barsParameter = new ArrayList< Integer> ();
barsParameter.add(1);
列表< Foo> resultList = tq.setParameter(bars,barsParameter).getResultList();


I would like to use a parameter expression as part of an in clause. I would like to query for a list of Foos that have a Bar that is in a set of Bars. Is this possible?

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

解决方案

With in expressions you can only use primitive comparison types, so you need to make a join and compare a field of a primitive type (here I have used 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();

这篇关于使用ParameterExpression作为In子句的一部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆