我想用ORMLite进行此查询,但我不能正确使用or()语句。
SELECT DISTINCT x FROM x x INNER JOIN x.w w WHERE:date> = x.startDate AND w.company.id =:companyId AND w.status =:status AND x.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,则此状态stil返回的endDate值等于null。如果我删除or()语句,一切正常。
感谢。
答案 0 :(得分:6)
我觉得你对AND
和OR
分组感到困惑。任何and()
或or()
操作(不带args)都会获取堆栈中的前一个元素,并将其与下一个参数组合,然后将结果推送到堆栈上。因此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"))));
这应该产生大约`(一个AND(b AND(c OR d)))',这似乎是你想要的。
要查看构建查询的各种方法,请查看文档: