Я получу три списка и 2 оператора op1, op2, которые могут быть «ИЛИ», «И», «И НЕ» .. Мне нужно сформировать запрос, подобный этому
например, рассмотрим сотрудника таблицы, я получу три списка List1, list2, list3 из emp_id's
select emp_num , emp_dpt , emp_name
from employee
where
emp_id in (list1)
op1
emp_id in (list2)
op2
emp_id in (list3)
Я написал два метода
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;
}
}
У меня проблема с дизъюнкцией. Когда я прохожу, ИЛИ интерпретирует как И ...
например, если я прохожу op1 = and
, op2 = or
он формируется так
select emp_num , emp_dpt , emp_name
from employee
where
emp_id in (list1)
and
emp_id in (list2)
and
emp_id in (list3)
но я хочу
select emp_num , emp_dpt , emp_name
from employee
where
emp_id in (list1)
and
emp_id in (list2)
or
emp_id in (list3)
где бы я ни ожидал или ставил, и неважно, op1 или op2
Нужна помощь ...