2015-12-09 1 views
0

У меня есть список, который кормить программно в соответствии с некоторыми условиями, код выглядит следующим образом:Hibernate построить запрос из списка <Criterion> с или операторами и динамическими ограничениями

List<Criterion> restrictionList = new ArrayList<Criterion>(); 
for(int i = 1; i<someconditions.length);i++){   
     if(condition1){ 
      restrictionList.add(...); 
     } else if(condition2){      
      restrictionList.add(...) 
     } else if(condition3){ 
      restrictionList.add(...)     
     }     
    }  

И при построении критериев, я сделал это :

for (int c = 0; c < restrictionList.size()-1;c++){ 
    crit.add(Restrictions.or(restrictionList.get(c),restrictionList.get(c+1))); 
} 

где положение в строке запроса выглядит:

((А или в) и (в или с))

, поскольку существует и в построенном предложении, некоторые результаты не показывают

Скажем, у меня есть записи R1, R2 и R3

R1 удовлетворяет условиям А и С R2 удовлетворяет условию А R3 удовлетворяет условие в и с

So (а или в) имеют R1, R2 и R3, (в или с) имеют R1 и R3

Поскольку оба условия связаны с AND, R-не остались от итогового результата

Как я могу сделать сделать, где положение выглядеть следующим образом:

(А или В или С)

Таким образом, записи могут быть отображены, когда они встречаются, по крайней мере одно условие

Спасибо.

+0

Извините, но какие у вас вопросы? О «некоторых результатах не показывают» - не можете ли вы привести пример, что показывают, а что нет? –

+0

@ViacheslavVedenin Извините, я не был достаточно ясен. Я отредактировал вопрос с более подробной информацией, дайте мне знать, если вам нужно другое разъяснение. – rhernandez

ответ

3
if (!restrictionList.isEmpty()) { 
    crit.add(or(restrictionList)); 
} 

private Disjunction or(List<Criterion> restrictions) { 
    Disjunction result = Restrictions.disjunction(); 

    for(Criterion restriction : restrictions) { 
     result.add(restriction); 
    } 

    return result; 
} 
+0

Отлично! Спасибо за быстрый ответ, он делает именно то, что мне нужно. – rhernandez

+0

@rhernandez. Добро пожаловать. –

+0

Отлично! спасибо –