“或”声明 - ORMLite

时间:2013-03-13 02:26:28

标签: ormlite

我想用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()语句,一切正常。

感谢。

1 个答案:

答案 0 :(得分:6)

我觉得你对ANDOR分组感到困惑。任何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)))',这似乎是你想要的。

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

  

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