5

我在用“或”加入 2 表达式列表时遇到了一些麻烦。这是我正在做的一个例子:

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。现在我需要用 or/and 加入 prevExp 和 exp 并替换 exp。接收 2个ExpressionList.or(exp, exp)表达式。对此的任何帮助表示感谢,谢谢

4

2 回答 2

13

您需要查看 Ebean Junctions功能。

有两种连接,连接和分离。使用连接,您可以使用 AND 将许多表达式连接在一起,而使用析取,您可以使用 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();
于 2013-12-06T17:09:37.053 回答
3

我在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();

谢谢詹姆斯让我的查询按我的预期工作。

于 2015-09-10T06:49:58.057 回答