2013-03-13 63 views
1

我打算使用ORMLite执行此查询,但我无法正确使用or()语句。“或”声明 - ORMLite

SELECT DISTINCT从x XX INNER JOIN XW W其中:日期> = x.startDate AND w.company.id =:companyId AND w.status =:状态和x.status = :状态AND( x.endDate = NULL OR x.endDate> =:日期)

我的代码:

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该状态下返回STIL结束日期等于空的值。如果我删除or()语句一切正常。

谢谢。

回答

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")))); 

这将产生约`(a和(B和(c或d)))”,这似乎是你想要的。

要看到不同的方式来构造查询,检查出的文档:

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

+0

现在它的正常工作! 感谢您的更好的解释,我不是仅基于ORMLite文档的理解。 – Basileus 2013-03-13 14:47:49