ORMLite中的多个组合OR条件

我喜欢这样的查询:

select data from table

where (x > 1 and x < 100)

or (x > 250 and x < 300)

在ORMlite中,可以使用以下代码:

final QueryBuilder<Data,Integer> qb = queryBuilder();

final Where<Data, Integer> w = qb.where();

w.or(

w.gt("x", 1).and().lt("x", 100),

w.gt("x", 250).and().lt("x", 300)

)

如果可以事先知道条件,并且在编码时就可以了,那么我需要动态添加条件。

基本上,这种方法public com.j256.ormlite.stmt.Where<T,ID>

or(com.j256.ormlite.stmt.Where<T,ID> left, com.j256.ormlite.stmt.Where<T,ID>

right, com.j256.ormlite.stmt.Where<T,ID>...

others)是不够的。它需要其他or支持的方法ArrayListWhere条件。

感谢您的任何建议。

回答:

如果可以事先知道条件,并且在编码时就可以了,那么我需要动态添加条件。

在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那里的方法仅使用参数来计算它需要从堆栈中弹出多少个子句。当你打电话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 stack

w.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 above

if (clauseC > 1) {

w.or(clauseC);

}

如果i只能是1到5,则可以使用values.size()并跳过clauseC。请注意,如果仅添加一个子句,则可以OR完全跳过方法调用。

哦,下面的语句将 无法 正常工作:

target.or().raw(first.getStatement());

因为targetfirst是同一对象。 first.getStatement()转储WHERE我认为不是您想要的整个SQL 子句。

以上是 ORMLite中的多个组合OR条件 的全部内容, 来源链接: utcz.com/qa/406644.html

回到顶部