我在使用“或”加入2 expressionList时遇到了一些麻烦。 这是我正在做的一个例子:
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)
这是完全动态的,因此varNames可以是任何当前存在的(因为查询是由用户使用网页界面构建的),所以我不能轻易使用原始SQL。现在我需要加入prevExp和exp和/或并替换exp。 ExpressionList.or(exp, exp)
收到2个表达式。
感谢您的任何帮助
答案 0 :(得分:12)
您需要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();
答案 1 :(得分: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();
感谢James让我的查询按照我的预期运行。