使用Criteria API的动态JPA 2.0查询 [英] Dynamic JPA 2.0 query using Criteria API

查看:117
本文介绍了使用Criteria API的动态JPA 2.0查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有点困惑,使用JPA 2.0的CriteriaBuilder构建动态查询。



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

 从Foo中选择e,其中(name = X1或name = X2。 。或name = Xn)

方法或CriteriaBuilder不动态:



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



想法?样本?

解决方案

在你的情况下,我宁愿使用 (Collection)中的表达式# ,以避免循环并构建一个复合 动态定义

  CriteriaBuilder cb = em.getCriteriaBuilder(); 

CriteriaQuery&Foo> cq = cb.createQuery(Foo.class);
元模型m = em.getMetamodel();
EntityType&Foo> Foo_ = m.entity(Foo.class);
根< Foo> foo = cq.from(Foo_);
cq.where(my.get(Foo_.name).in(params));

您可能需要检查使用Criteria API和Metamodel API的基本类型安全查询获取更多详细信息。


I am a bit stucked constructing a dynamic query using the CriteriaBuilder of JPA 2.0.

I have quite a common use case I guess: User supplies a arbitrary amount of search parameters X to be and / or concatenated: like :

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

The Method or of CriteriaBuilder is not dynamic:

Predicate or(Predicate... restrictions)

Ideas? Samples?

解决方案

In your case, I would rather use Expression#in(Collection) to avoid having to loop and to build a compound Predicate dynamically:

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

You might want to check Basic Type-Safe Queries Using the Criteria API and Metamodel API for more details.

这篇关于使用Criteria API的动态JPA 2.0查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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