2012-06-12 4 views
4

У меня возникли проблемы с подключением 2 выраженияList с помощью «или». Это пример того, что я делаю:присоедините два выраженияList с помощью «или» или «и»

RelationGroup prg =... 
ExpressionList<User> exp = User.find.where(); 
List<ExpressionList<User>> expressions = new ArrayList<ExpressionList<User>>() 
List<String> relations = new ArrayList<String>() 

while(prg != null){ 

    if(prg.prevGroupRelation != null) 
     relations.add(prg.prevGroupRelation); 

    for(RelationAtt pra : prg.prAtt){ 
     if(pra.rel.equals("eq")) 
      exp = exp.eq(pra.name, pra.value1); 
     else if(pra.rel.equals("lt")) 
      exp = exp.lt(pra.name, pra.value1); 
     else if(pra.rel.equals("gt")) 
      exp = exp.gt(pra.name, pra.value1); 
     else if(pra.rel.equals("bw")) 
      exp = exp.gt(pra.name, pra.value1).lt(pra.name, pra.value2); 
    } 

    expression.add(exp); 
    prg=prg.nextPRG(); 
    exp = new ExpressionList<User>(); 
} 

for(i=0;i<expressions.count-1; i++) 
    if(relations[i].equals("or")){ 
     //ToDo: (expressions[i]) or (expressions[i+1])      
    }else{ 
     //ToDo: (expressions[i]) and (expressions[i+1])      
    } 

мне нужно иметь что-то вроде:

select * 
from tableName 
where (varName1=value and varName2=value) or (varName3) or (varName4=value and varName5=value) 

Это полностью динамическое, поэтому имя переменной может быть любым из существующих в настоящее время (поскольку запросы создаются пользователем с использованием интерфейса веб-страницы), поэтому я не могу легко использовать необработанный SQL. Теперь мне нужно присоединиться к prevExp и exp с помощью or или и заменить exp. ExpressionList.or(exp, exp) получают 2 выражения. Любая помощь с благодарностью благодарит вас

ответ

11

Вам нужно, чтобы check out the Ebean Junctions функция.

Существует два вида соединений, кондукции и дизъюнкции. С конъюнкцией вы можете объединить много выражений с AND, а с помощью Disjunction вы объединяете много выражений с OR.

Например:

Query q = Ebean.createQuery(YourClass.class); 
q.where().disjunction() 
    .add(Expr.eq("varName1",value).eq("varName2",value)) 
    .add(Expr.eq("varName3",value3)) 
    .add(Expr.eq("varName4",value4).eq("varName5",value5)) 

генерировать SQL как это:

SELECT * FROM tablename WHERE (varName1=value and varName2=value) or (varName3=value3) or (varName4=value4 and varName5=value5) 

Если вы хотите гибкость, чтобы выбрать тип перехода вы можете сделать это:

Query q = Ebean.createQuery(YourClass.class); 
Junction<YourClass> junction; 

if("or".equals(desiredJunctionType)){ 
    junction = query.where().disjunction(); 
} else { 
    junction = query.where().conjunction(); 
} 

// then you can add your expressions: 
junction.add(Expr.eq("varName1",value).eq("varName2",value)); 
junction.add(Expr.eq("varName3",value3)); 
// etc... 
// and finaly get the query results 
List<YourClass> yourResult = junction.query().findList(); 
2

Я нашел, что, похоже, тот же вопрос на google groups, так что давайте все получим этот ответ здесь, как привет л.

List<MobileUser> users = Ebean.find(MobileUser.class) 
    .where() 
     .disjunction() 
      .conjunction() 
       .eq("col1", val) 
       .eq("col2", val) 
      .endJunction() 
      .eq("col3", anotherValue) 
      .conjunction() 
       .eq("col4", val) 
       .eq("col5", val) 
      .endJunction() 
     .endJunction() 
    .findList(); 

Спасибо, Джеймс, за то, что я запросил работу, поскольку я намеревался ее использовать.

Смежные вопросы