2014-06-19 4 views
2

요구 사항 : 초기 조건이 있습니다. 즉, P1은 술어입니다. 데이터베이스 테이블에 null 일 수있는 날짜 필드가 있습니다. 그것이 널 (null)이면, 초기 술어 자체를 진행할 수 있습니다. 그것이 널이 아닌 경우, 해당 필드의 값은 지정된 날짜 사이에 있어야합니다.JPA의 복합 술부 Criteria Query - and와 or를 모두 사용합니다.

Approach1 : 내 검색어에 '및' '또는'조건을 모두 사용하려고합니다. 문제는 술어의 조합에 있습니다.

Predicate P1 = criteriaBuilder.equal(a,b); 
Predicate P2 = criteriaBuilder.isNull(myDate); 
Predicate P3 = criteriaBuilder.isNotNull(myDate); 
Predicate P4 = criteriaBuilder.between(currentDate,previousDate); 


Predicate P34 = criteriaBuilder.and(P3,P4); 
Predicate P234 = criteriaBuilder.or(P2,P34); 
Predicate P1234 = criteriaBuilder.and(P1,P234); 
criteriaBuilder.where(P1234); 
쿼리

예상 조건 : P1 AND (P2 OR (P3 및 P4)) 쿼리

실태 : P1 및 P2 또는 P3 및 P4

하여 추정 : 일부 수학 사용 집합론 대괄호를 확장하십시오.

쿼리

예상 조건

Predicate P12 = criteriaBuilder.and(P1,P2); 
Predicate P34 = criteriaBuilder.and(P3,P4); 
Predicate P134 = criteriaBuilder.and(P1,P34); 
Predicate P12134 = criteriaBuilder.or(P12,P134); 
criteriaBuilder.where(P12134); 
(P1 및 P2) OR (P1 및 P3 및 P4) 쿼리

실태 : P1 및 P2 OR P1 및 P3 및 예약 P4

양 접근 방법 나는 괄호가 빠져있다. 이 대괄호를 가져 오는 방법을 제안하십시오. 요구 사항을 충족시키기위한 더 나은 접근 방법이 있습니까 ??

답변

1

두 경우 모두 예상 조건과 실제 조건은 동일합니다. 표현식은 왼쪽에서 오른쪽으로 계산되며 ANDOR보다 우선합니다. 다른 모든 거짓 항복 반면

함께하고 괄호없이 모두 첫 번째 쿼리를 보면, 다음과 같은 조합은 사실 산출 :

SELECT true AND true OR true AND true; 
SELECT true AND false OR true AND true; 
SELECT true AND true OR false AND false; 

SELECT true AND (true OR (true AND true)); 
SELECT true AND (false OR (true AND true)); 
SELECT true AND (true OR (false AND false)); 
+0

황소 눈 ... 감사 @Robby 코넬리을 ..하지만 난으로 생각 접근 방식 1 : 예상과 실제는 귀하의 설명과 동일한 결과를 산출하지 않습니다. 그러나, 나는 내가 찾고 있었던 것을 얻었다. – tortoise