【问题标题】:Using a ParameterExpression as part of the In clause使用 ParameterExpression 作为 In 子句的一部分
【发布时间】:2012-08-04 11:10:25
【问题描述】:

我想使用参数表达式作为 in 子句的一部分。我想查询一个 Foos 列表,该列表中有一个 Bars 位于一组 Bars 中。这可能吗?

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

【问题讨论】:

  • 也许这个link 会有所帮助:这与ParameterExpressionS 无关,但可以作为一个起点......
  • 我发现的所有内容(包括您的链接)在创建 CriteriaQuery 时都有 in 子句的实际数据。我一直在使用 CriteriaQuery 构建一次并使用参数表达式设置实际参数的模式。我只是希望在使用 ParameterExpression 时我忽略了一些简单的事情。

标签: java hibernate jpa jpa-2.0


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 2021-02-14
    • 2018-11-11
    相关资源
    最近更新 更多