1

我正在尝试使用 ORMLite 进行此查询,但我无法正确使用 or() 语句。

从 xx INNER JOIN xw w 中选择 DISTINCT x WHERE :date >= x.startDate AND w.company.id = :companyId AND w.status = :status AND x.status = :status AND (x.endDate = NULL OR x.结束日期 >= :日期)

我的代码:

QueryBuilder<x, Integer> xQB = this.xDao.queryBuilder();
xQB.where().eq("status", StatusEnum.ENABLED).and().le("startDate", date)
.and().ge("endDate", date).or().isNull("endDate");

如果日期小于 startDate,则此状态仍然返回 endDate 的值等于 null。如果我删除 or() 语句一切正常。

谢谢。

4

1 回答 1

6

我有一种感觉,您对ANDOR分组感到困惑。任何and()or()操作(不带参数)获取堆栈上的前一个元素并将其与下一个参数组合,然后将结果压入堆栈。就这样a AND b AND c OR e变成了大约(((a AND b) AND c) OR e)

该类Where还具有接受参数and(...)or(...)方法,这些参数将比较包装在括号中。这在像您这样的情况下很有用,当您需要明确说明要比较的内容时。我会将您的更改为:

QueryBuilder<x, Integer> xQB = this.xDao.queryBuilder();
Where<x, Integer> where = xQB.where();
where.and(where.eq("status", StatusEnum.ENABLED),
    where.and(where.le("startDate", date),
        where.or(where.ge("endDate", date), where.isNull("endDate"))));

这应该会生成大约 `(a AND (b AND (c OR d)))' 这似乎是您想要的。

要查看构建查询的各种方法,请查看文档:

http://ormlite.com/docs/building-queries

于 2013-03-13T13:05:56.197 回答