当前位置: 首页 > 面试题库 >

ORMLite中的多个组合OR条件

马嘉勋
2023-03-14
问题内容

我喜欢这样的查询:

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 子句。



 类似资料:
  • 我的selenium代码通过等待网站标题更改来检查完成的子例程,该子例程运行良好。代码如下所示: 但是,这有时可能会失败,因为站点的登录页面在手动网站访问后发生变化。服务器会记住您离开的位置。这迫使我检查另一个条件(网站标题="notestring2)。 以下是我到目前为止所想到的(据我所知也有效): 这些条件中的任何一个始终为真。我不知道你是哪一个。 有没有什么方法可以在这些等待中包含一个“或”

  • 问题内容: 我想用cakephp进行这样的查询: 这是我的$ conditions代码: 我正在使用Debugger :: dump()方法显示结果,并且结果仅使用最后一个“ OR”条件,而不是同时使用“ OR”条件: 我的问题是,如何进行查询以同时使用“ OR”条件? 请尽快回复..在此先感谢:) 问题答案: 请尝试以下方法: 将是 任何阵列没有指定,或者是。无需手动指定。

  • 通过组合曲线CurvePath可以把多个圆弧线、样条曲线、直线等多个曲线合并成一个曲线。 U型案例 var geometry = new THREE.Geometry(); //声明一个几何体对象Geometry // 绘制一个U型轮廓 var R = 80;//圆弧半径 var arc = new THREE.ArcCurve(0, 0, R, 0, Math.PI, true); // 半圆弧

  • 问题内容: 我正在尝试获取id = 3或id = 9或id = 100的内容…请记住,我可以拥有几百个这些ID。 编写查询的最有效方法是什么? 问题答案:

  • 问题内容: 我正在使用带有数据存储数据库的Google App Engine上的NodeJS。 由于数据存储区不支持OR运算符,因此我需要运行多个查询并合并结果。 我计划运行多个查询,然后将结果组合到单个实体对象数组中。我已经有一个查询正在工作。 问题:将数据存储区返回的两套(或多套)实体(包括重复数据删除)组合在一起的合理有效方式是什么?我相信这将是集合论的“联合”行动。 这是基本查询大纲,将使

  • 在这篇文章之后,如何使用Laravel Eloquent创建多个where子句查询? 我正在尝试插入多个“和”条件: 但我收到这个错误: