【问题标题】:Dynamic JPA 2.0 query using Criteria API使用 Criteria API 的动态 JPA 2.0 查询
【发布时间】:2011-01-31 09:25:48
【问题描述】:

我在使用 JPA 2.0 的 CriteriaBuilder 构建动态查询时有点卡住了。

我猜我有一个很常见的用例:用户提供任意数量的搜索参数 X 来连接和/或连接:比如:

select e from Foo where (name = X1 or name = X2 .. or name = Xn )

CriteriaBuilder 的 Method or 不是动态的:

谓词或(谓词...限制)

想法?样品?

【问题讨论】:

    标签: java dynamic jpa criteria-api jpa-2.0


    【解决方案1】:

    在您的情况下,我宁愿使用Expression#in(Collection) 来避免循环并动态构建复合Predicate

    CriteriaBuilder cb = em.getCriteriaBuilder();
    
    CriteriaQuery<Foo> cq = cb.createQuery(Foo.class);
    Metamodel m = em.getMetamodel();
    EntityType<Foo> Foo_ = m.entity(Foo.class);
    Root<Foo> foo = cq.from(Foo_);
    cq.where(my.get(Foo_.name).in(params));
    

    您可能需要查看Basic Type-Safe Queries Using the Criteria API and Metamodel API 了解更多详情。

    【讨论】:

    • 嗨,Pascal Thivent,如果参数是子查询,代码怎么写?
    【解决方案2】:

    在此代码中 Foo_.name 将给出编译错误。由于该字段未在其中声明。我无法理解这一点。请给我建议。

    -拉古

    【讨论】:

    • 上面的例子是基于持久单元的托管类的元模型(可以使用 JPA 实现提供的注释处理器生成)。但请不要在现有线程中发布问题作为答案,而是打开一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2017-06-11
    • 2011-10-17
    • 2016-06-25
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    相关资源
    最近更新 更多