使用 Criteria API 的动态 JPA 2.0 查询

发布于 2024-08-26 06:10:02 字数 266 浏览 6 评论 0原文

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

我猜想我有一个相当常见的用例:用户提供任意数量的搜索参数 X 进行和/或连接:例如:

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

CriteriaBuilder 的方法或不是动态的:

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

想法?样品?

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不奢求什么 2024-09-02 06:10:02

在你的情况下,我宁愿使用 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));

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文