2010-03-24 58 views
9

我有点用SturtyBoolean构建动态查询。使用Criteria API的动态JPA 2.0查询

我有相当常见的用途情况下,我想:用户提供的搜索参数X的任意的量为和/或级联:像:

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

方法或CriteriaBuilder的不是动态的:

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

想法?样品?

回答

7

在你的情况,我宁愿用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了解更多详情。

+0

嗨,Pascal Thivent,如果params是一个子查询,怎么写代码? – 2010-12-19 15:32:24

1

在这段代码中Foo_.name会给编译错误。因为该领域没有在那里宣布。我无法理解这一点。请建议我。

-raghu

+3

上述示例基于持久性单元托管类的元模型(可使用JPA实现提供的注释处理器生成)。但是,请不要在现有的主题中发布问题作为答案,而是开个新问题。 – 2010-08-06 09:01:01