2012-03-28 8 views
0

Ich werde drei Listen und 2 Betreiber op1 bekommen, op2, die sein kann „ODER“, „UND“, „AND NOT“ .. ich brauche wie dieseAusgabe mit Disjunktion in DetachedCriteria

eine Abfrage zu bilden zum Beispiel eine Tabelle Mitarbeiter berücksichtigen, werde ich drei Listen Liste1, Liste2, list3 von emp_id des

select emp_num , emp_dpt , emp_name 

from employee 

where 
    emp_id in (list1) 

    op1 

    emp_id in (list2) 

    op2 

    emp_id in (list3) 

ich geschrieben zwei Methoden haben

public List<Employee> getRequestedEmployee(List<Long> list1 , List<Long> list2, List<Long> list3 , String op1 , String op2) { 

    DetachedCriteria dc = DetachedCriteria.forClass(Employee) 

    if (!CollectionUtils.isEmpty(list1)) 
    { 
     dc.add(Restrictions.in(list1,emp_id)); 
    } 

    if(!CollectionUtils.isEmpty(list3) 
    { 
     dc = getCriteria(dc , list2 , op1); 
    } 

    if(!CollectionUtils.isEmpty(list3) 
    { 
     dc = getCriteria(dc , list3 , op2); 
    } 
} 

private DetachedCriteria getCriteria(DetachedCriteria dc , List<long> empIdList, String operator) 
{ 
    if(!CollectionUtils.IsEmpty(empIdList)) 
    { 
     if("and".equals(operator)) 
     { 
      Conjunction andOp = Restrictions.Conjunction(); 
      andOp.add(Restrictions.in(empIdList)); 
      dc.add(andOp); 
     } 
     else if("or".equals(operator)) 
     { 
      Disjunction orOp = restrictions.disjunction(); 
      orOp.add(Restrictions.in(empIdList)) 
      dc.add(andOp); 
     } 
     else 
     { 
      dc.add(Restrictions.not(empIdList)); 
     } 
     return dc; 
    } 
} 

ich bin vor Problem mit Disjunction bekommen .. Wann immer bin vorbei Oder es ist die Interpretation als UND ..

zum Beispiel, wenn op1 = and ist vorbei, op2 = or es bildet wie diese

select emp_num , emp_dpt , emp_name 

from employee 

where 
    emp_id in (list1) 

    and 

    emp_id in (list2) 

    and 

    emp_id in (list3) 

aber was ich will, ist

select emp_num , emp_dpt , emp_name 

from employee 

where 
    emp_id in (list1) 

    and 

    emp_id in (list2) 

    or 

    emp_id in (list3) 

wo immer erwarten oder ist Putting und egal op1 oder op2

Benötigen Sie Hilfe ...

Antwort

0

Die And kommt von dc.add(). Jedes Add wird ein Kriterium sein, das mit und zusammengestellt wird. Eine Disjunktion mit 1 Argument ist grundsätzlich ein Noop, weil crit and <nothing> = crit. Sie müssen die Kriterien auf Kriterienebene nicht auf Abfrage-/Kriterienebene

public List<Employee> getRequestedEmployee(List<Long> list1 , List<Long> list2, List<Long> list3 , String op1 , String op2) 
{ 
    ICriterion crit = null; 

    if (!CollectionUtils.isEmpty(list1)) 
    { 
     crit = Restrictions.in("emp_id", list1)); 
    } 

    if(!CollectionUtils.isEmpty(list3) 
    { 
     crit = addCriteria(crit , list2 , op1); 
    } 

    if(!CollectionUtils.isEmpty(list3) 
    { 
     crit = addCriteria(crit , list3 , op2); 
    } 

    DetachedCriteria query = DetachedCriteria.forClass(Employee); 
    if (crit != null) 
    { 
     query = query.add(crit); 
    } 
    return query; 
} 

private ICriterion addCriteria(ICriterion existingCrit, List<long> empIdList, String operator) 
{ 
    if(CollectionUtils.IsEmpty(empIdList)) 
    { 
     return existingCrit; 
    } 

    ICriterion crit = Restrictions.in("emp_Id", empIdList); 

    if(existingCrit == null) 
    { 
     return crit; 
    } 
    else if("and".equals(operator)) 
    { 
     return Restrictions.conjunction() 
      .add(existingCrit); 
      .add(crit); 
    } 
    else if("or".equals(operator)) 
    { 
     return Restrictions.disjunction() 
      .add(existingCrit); 
      .add(crit); 
    } 
    else // "not" 
    { 
     return Restrictions.conjunction() 
      .add(existingCrit); 
      .add(Restrictions.not(crit)); 
    } 
} 
ansammeln