2010-03-24 16 views
9

JPA 2.0 CriteriaBuilder kullanarak dinamik bir sorgu oluşturmaktan sıkıldım.Kriterler API'sini kullanan Dinamik JPA 2.0 sorgusu

sanırım oldukça genel kullanımını vardır: gibi: Kullanıcı olabilir ve/veya birleştirilmiş arama parametreleri X bir keyfi miktarda malzeme

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

Yöntem veya CriteriaBuilder dinamik değildir:

Predicate veya (Predicate ... restrictions)

Fikirler? Numuneler? Senin durumunda

cevap

7

, oldukça döngü zorunda kalmamak için Expression#in(Collection) kullanacağı ve dinamik bir bileşik Predicate inşa etmek:

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

daha fazla detay için Basic Type-Safe Queries Using the Criteria API and Metamodel API kontrol etmek isteyebilirsiniz. Bu kodda Foo_.name derleme hatası verecek

+0

Merhaba, Pascal Thivent, nasıl kod yazabilir? –

1

. Bu alanın ilan edilmediği gibi. Bunu anlayamıyorum. Lütfen bana öner. parametreler bir alt sorgu ise

-raghu

+3

Yukarıdaki örnek, kalıcılık biriminin yönetilen sınıflarının (JPA uygulaması tarafından sağlanan bir ek açıklama işlemcisi kullanılarak oluşturulabilecek) bir metamodeline dayanmaktadır. Ancak lütfen, mevcut ileti dizisinde yanıt olarak soru göndermeyin, bunun yerine yeni bir soru açın. –