2012-10-18 1 views
1

ConjunctionDisjunction을 사용하는 데 문제가 있습니다. 내 프로그램은 ui에서 임의의 수의 필터 요소 (각각 Criterion을 나타냄)를 수신하고 함께 연결하기 위해 AND 또는 OR으로 지정됩니다.최대 절전 기준 API (분리 및 결합) 문제

a OR b AND c 

내 코드는 다음과 같습니다 :

그래서 예를 들어 나는 (내가 편지와 Criterion를 나타냅니다)이 추천 요소를 가질 수

// ... 
    Criteria rootCriteria = createCriteria(entityClass); 
    Conjunction conjunction = Restrictions.conjunction(); 
    Disjunction disjunction = Restrictions.disjunction(); 
    boolean isFirst = true; 
    for (InternalFilterElement element : elements) { 
     if (isFirst) { 
      isFirst = false; 
      rootCriteria.add(createCriterion(element.getFilterRelation(), element.getValue())); 
     } else if (InternalFilterOperand.AND.equals(element.getInternalFilterOperand())) { 
      addCriterionToJunction(conjunction, element); 
     } else { 
      addCriterionToJunction(disjunction, element); 
     } 
    } 
    rootCriteria.add(disjunction); 
    rootCriteria.add(conjunction); 
    // ... 

내 문제는 내가 그 항상 a AND b AND c과 불필요한 괄호를 사용하십시오.

내가 정말로 알고 싶은 것은이 작업에 잘못된 도구를 사용하고 있는지 아닌지입니다. ANDOR 연산자를 어떻게 조합 할 수 있습니까? 편집

InternalFilterOperand

기본적 OR

addCriterionToJunctionAND 함유 enum 단지 추가 관계에 기초 Junction (<>, ...) 및 값에 Criterion . 부작용이 없습니다.

+0

'InternalFilterOperand'란 무엇입니까? 또한'addCriterionToJunction'을 공유 할 수 있습니까? –

답변

6

에 직접 conjunction/disjunction를 추가, 당신은 최대 절전 모드에서 AND와 OR 연산자를 혼합 :

Criteria rootCriteria = createCriteria(entityClass); 
    rootCriteria.add(Restrictions.or(
      Restrictions.eq("a","a"), 
      Restrictions.and(
        Restrictions.eq("b","b"), 
        Restrictions.eq("c","c") 
      ) 
    )); 

이 예제의 결과를 다음에 출력 : a = a OR b = b AND c = c 괄호없이 결합과 분리로 얻을 수 있습니다.

+0

이 작업이 가능합니까? : 기준 ANDORs = null; if (ANDORs == null) { if (grupo.getOperadorLogico(). equals (PesquisaFiltroOperadorLogico.AND)) { ANDORs = Restrictions.conjunction(); } else { ANDORs = Restrictions.disjunction(); } } – Maxrunner

0

당신은 필요 이상으로 어렵게 만들고 있습니다. 바로 다음 사용하지 이유 :

Junction junction = 
    InternalFilterOperand.AND.equals(element.getInternalFilterOperand()) ? 
     Restrictions.conjunction() : 
     Restrictions.disjunction(); 
for (InternalFilterElement element : elements) { 
    addCriterionToJunction(junction, element); 
} 
rootCriteria.add(junction); 
+1

나는 이미 그것을 시험해 보았다. 어느 쪽도 작동하지 않습니다. 모든 'InternalFilterElement'에는 OR 또는 AND가 포함되어 있으므로 루프 외부에서 어느 것을 사용할 지 결정할 수 없습니다. –

-1

나는 다른 모든 것을 잘 보이는 InternalFilterOperandelements에서 정확하지 않은 것 믿고 가까이입니다.

루프에 element.getInternalFilterOperand() 값을 인쇄/디버그하여 확인하고 수정하는 첫 번째 문장으로 인쇄하십시오.

편집 : 시도는 다음 코드를 사용하여 rootCriteria

for (InternalFilterElement element : elements) { 
    if (isFirst) { 
     isFirst = false; 
     rootCriteria.add(
       createCriterion(element.getFilterRelation(), element.getValue())); 
    }else if (InternalFilterOperand.AND.equals(element.getInternalFilterOperand())){ 
     //add debugg/sys out: adding conjunction 
     System.out.println("adding conjunction"); 
     rootCriteria.add(Restrictions.conjunction().add(element)); 
    } else { 
     //add debugg/sys out: adding disjunction 
     System.out.println("adding disjunction"); 
     rootCriteria.add(Restrictions.disjunction().add(element)); 
    } 
} 
+0

'InternalFilterElement'에서 toString()을 오버로드했고'elements '를 읽으면 "null foo = bar and wom = bat 또는 baz = bar"와 같은 내용이 출력됩니다. 첫 번째 요소는 피연산자를 포함하지 않지만 괜찮습니다. –

+0

나를 'for' 루프에서 첫 문장으로 추가하고 출력을 공유하십시오. 'System.out.println (InternalFilterOperand.AND); System.out.println (요소.getInternalFilterOperand()); System.out.println (InternalFilterOperand.AND.equals (element.getInternalFilterOperand())); ' –

+0

이전 주석에서 이미 공유했습니다. 내가 정말로 알고 싶은 것은 이것이다 : "어떻게 AND 연산자와 OR 연산자를 섞을 수 있습니까?" –