2011-07-04 8 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에서

  • 버그 (최대 절전 모드와 같은 시도) 최적화
  • 어떤 종류가, 어쩌면 endDate가 null 결코 할 수있다?
  • 당신의 getEm() 메소드는 어떤 이상한 일들
+0

많은 연구 끝에이 매우 문제가있는 EclipseLink에서 https://bugs.eclipse.org/bugs/show_bug.cgi?id=316144 버그를 발견했습니다. 2.3으로 업그레이드 한 후 효과가 좋습니다! – Miller