2011-07-04 20 views
7

javax.persistence.criteria.CriteriaBuilder ile sorgular oluşturma konusunda bir sorun yaşıyorum. EclipseLink 2.1 ve bir Oracle 10g veritabanı kullanıyorum. Birden fazla kısıtlamaya sahip bir sorgu oluştururken, her ikisini de değil, yalnızca ilk kısıtlamayı kullanır.Jpa QueryBuilder Maddenin çalışmadığı yerde birden çok ifade

CriteriaBuilder cb = getEm().getCriteriaBuilder(); 
CriteriaQuery<Assignment> query = cb.createQuery(Assignment.class); 
Root<Assignment> assignment = query.from(Assignment.class); 

query.where(
    cb.equal(assignment.get("request"), request), 
    cb.isNull(assignment.get("endDate"))); 

return getEm().createQuery(query).getResultList(); 

üretilmiş sorgu:

SELECT ASSX_ID, END_DATE, BEGIN_DATE, COMMENTS, 
     ASSX_OER_ASSIGNED_TO_ID, OER_OER_ID_ASSIGNED_BY, 
     ASSX_RQST_ID 
FROM TARTS.ASSIGNMENT_XREF 
WHERE (ASSX_RQST_ID = ?) 

O nerede hüküm haricinde iyi görünüyor

İşte benim kodudur. Ben bekliyorum: Ben de cb.and (ARG1, arg2) ya da kullanmak eğer fark etmez

SELECT ASSX_ID, END_DATE, BEGIN_DATE, COMMENTS, 
     ASSX_OER_ASSIGNED_TO_ID, OER_OER_ID_ASSIGNED_BY, 
     ASSX_RQST_ID FROM TARTS.ASSIGNMENT_XREF 
WHERE (ASSX_RQST_ID = ? AND BEGIN_DATE IS NOT NULL) 

. Yanlış bir şey mi yapıyorum? Herhangi bir yardım takdir edilecektir.

+0

Kişisel cb.isNull isNotNull olmalıdır yapar. Daha fazla kısıtlama eklemeyi denediniz mi ve/veya bağlantınızı açıkça tanımlamaya çalıştınız mı? – jelle

cevap

4

Sorgunuz mükemmel görünüyor. Daha önce de belirttiğiniz gibi, CriteriaQuery.where(Predicate... restrictions) zaten yüklemlerin bağlantılarını kullanır, bu nedenle cb.and() işlevini kullanmaya gerek yoktur. Ben hayal

tek şey: EclipseLink içinde

  • böcek (hazırda ile aynı deneyin) optimizasyonu
  • çeşit, belki endDate null asla?
  • sizin GETEM() yöntemi bazı garip şeyler
+0

Çok araştırmadan sonra, bu çok sorunla EclipseLink'te bir hata https://bugs.eclipse.org/bugs/show_bug.cgi?id=316144 buldum. 2.3'e yükselttikten sonra harika çalışır! – Miller