unir dos listas de expresiones con "o" o "y"
Frecuentes
Visto 6,693 equipos
5
Tengo algunos problemas para unir 2 expressionList con un "o". Este es un ejemplo de lo que estoy haciendo:
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])
}
Necesito tener algo como:
select *
from tableName
where (varName1=value and varName2=value) or (varName3) or (varName4=value and varName5=value)
Esto es completamente dinámico, por lo que los varNames pueden ser cualquiera de los existentes actualmente (porque el usuario crea las consultas mediante una interfaz de página web), por lo que no puedo usar SQL sin procesar tan fácilmente. Ahora necesito unirme a prevExp y exp con or/and y reemplazar exp. El ExpressionList.or(exp, exp)
recibir 2 Expresiones. Cualquier ayuda con esto es apreciada gracias
2 Respuestas
13
Tu necesitas echa un vistazo a los cruces de Ebean .
Hay dos tipos de Uniones, Conjunción y Disyunción. Con una conjunción puedes unir muchas expresiones con AND, y con una disyunción puedes unir muchas expresiones con OR.
Por ejemplo:
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))
generar un sql como este:
SELECT * FROM tablename WHERE (varName1=value and varName2=value) or (varName3=value3) or (varName4=value4 and varName5=value5)
Si desea flexibilidad para seleccionar el tipo de cruce, puede hacer esto:
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();
Respondido el 06 de diciembre de 13 a las 17:12
3
Encontré, lo que parece ser, la misma pregunta en grupos de google, así que disfrutemos de esa respuesta aquí también.
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();
Gracias James por hacer que mi consulta funcione como pretendía.
Respondido el 10 de Septiembre de 15 a las 07:09
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ebean or haz tu propia pregunta.