如果可以事先知道条件,并且在编码时就可以了,那么我需要动态添加条件。
在ORMLite
Where.or(Where<T, ID> left, Where<T, ID>right, Where<T, ID>... others)中有一点语法上的缺陷。您打电话的时候:
w.or( w.gt("x", 1).and().lt("x", 100), w.gt("x", 250).and().lt("x", 300));
该
or()方法得到的是:
w.or(w, w);
您确实可以将其重写为:
w.gt("x", 1).and().lt("x", 100);w.gt("x", 250).and().lt("x", 300);w.or(w, w);
or那里的方法仅使用参数来计算它需要从堆栈中d出多少个子句。当你打电话
gt,并
lt和其他人,其在推的条款堆项目。该
and()方法从堆栈中取出1个项目,然后在将来取出另一个项目。我们进行这些语法修改是因为我们要支持基于线性,链接和参数的查询:
w.gt("x", 1);w.and();w.lt("x", 100);
与:
w.gt("x", 1).and().lt("x", 100);
与:
w.and(w.gt("x", 1), w.lt("x", 100));
但这意味着您可以使用Where.or(int many)方法极大地简化代码。因此,在
or上面的示例中还可以是:
w.gt("x", 1).and().lt("x", 100);w.gt("x", 250).and().lt("x", 300);// create an OR statement from the last 2 clauses on the stackw.or(2);
因此,您根本不需要
conditions列表。您只需要一个柜台。因此,您可以执行以下 *** 作:
int clauseC = 0;for (int i : values) { if (i == 1) { w.le(C_PREIS, 1000); clauseC++; } else if (i == 2) { w.gt(C_PREIS, 1000).and().le(C_PREIS, 2500); clauseC++; } else if (i == 3) { w.gt(C_PREIS, 2500).and().le(C_PREIS, 5000); clauseC++; } else if (i == 4) { w.gt(C_PREIS, 5000).and().le(C_PREIS, 10000); clauseC++; } else if (i == 5) { w.gt(C_PREIS, 10000); clauseC++; }}// create one big OR(...) statement with all of the clauses pushed aboveif (clauseC > 1) { w.or(clauseC);}
如果
i只能是1到5,则可以使用
values.size()并跳过
clauseC。请注意,如果仅添加一个子句,则可以
OR完全跳过方法调用。
哦,下面的语句将 无法 正常工作:
target.or().raw(first.getStatement());
因为
target和
first是同一对象。
first.getStatement()转储
WHERe我认为不是您想要的整个SQL 子句。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)