我试图用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()语句,一切都可以正常工作。
谢谢。
我有一种感觉你对AND
和OR
分组感到困惑。任何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