gpt4 book ai didi

java - ORMLite 中的多个组合 OR 条件

转载 作者:搜寻专家 更新时间:2023-10-30 21:18:25 25 4
gpt4 key购买 nike

我喜欢这样的查询:

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支持 ArrayList 的方法的 Where条件。

感谢您的任何建议。

最佳答案

While thats great if one knows the conditions beforehand & at the time of coding, I need the conditions to be dynamically added.

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方法只使用参数来计算需要从堆栈中弹出多少个子句。当您调用 gtlt和其他人,它将项目插入子句堆栈。 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()转储整个 SQL WHERE我认为这不是您想要的子句。

关于java - ORMLite 中的多个组合 OR 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9963015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com