2011-07-04 73 views
7

我在使用javax.persistence.criteria.CriteriaBuilder創建查詢時遇到問題。我正在使用EclipseLink 2.1和一個Oracle 10g數據庫。在構建具有多個限制的查詢時,它將只使用第一個限制,而不是兩個限制。Jpa QueryBuilder where子句中的多個表達式不起作用

這裏是我的代碼:

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

開發生產的查詢是:

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 = ?) 

它看起來不錯,除了where子句。我期待:

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) 

如果我使用cb.and(arg1,arg2)或不,也沒有關係。難道我做錯了什麼?任何幫助將不勝感激。

+0

你的cb.isNull應該是isNotNull。你是否嘗試添加更多的限制和/或試圖明確定義你的連接? – jelle

回答

4

你的查詢看起來非常好。正如你所提到的,CriteriaQuery.where(Predicate... restrictions)已經使用了謂詞的連接,所以不需要使用cb.and()。

唯一的東西我能想象:

  • 臭蟲的EclipseLink(嘗試與Hibernate一樣)
  • 某種優化,也許endDate決不能爲空?
  • 你的getEm()方法做一些奇怪的事
+0

經過大量研究,我在EclipseLink中發現了一個bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=316144,這個問題非常嚴重。升級到2.3後,它的功能非常棒! – Miller