"Or"声明 - 奥姆莱特

  • 本文关键字:Or 声明 ormlite
  • 更新时间 :
  • 英文 :


我试图用ORMLite做这个查询,但我只是不能正确使用or()语句。

SELECT DISTINCT x FROM x INNER JOIN x.w w WHERE:date>= x.w startdateAND .company.id =:companyId AND .status =:status AND .status =:status AND (x.endDate = NULL OR x.endDate>=:date)

我代码:

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

如果date小于startDate,这个状态仍然返回endDate等于null的值。如果我删除or()语句,一切都可以正常工作。

谢谢。

我有一种感觉你对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

最新更新