4

我需要在查询的 WHERE 条件中实现一个 CASE。我写了以下代码:

QueryBuilder<Cars, String> carsQB = carsDao.queryBuilder();
carsQB.selectColumns("id");
carsQB.join(modelsDao.queryBuilder());                          

carsQB.where().raw("CASE WHEN future = true THEN date > ? ELSE endDate > ? END",
    new SelectArg("date"), new SelectArg("endDate"));

但我收到以下错误:

E/AndroidRuntime(4599): Caused by: java.lang.IllegalArgumentException:
       Either the column name or SqlType must be set on each argument

date 和 endDate 都是我数据库中的 Date 列。

我错过了什么?有没有更好的方法来实现这一点?谢谢!

4

1 回答 1

7

问题是(不幸的是)调用new SelectArg(String)调用SelectArg(Object) constructor设置而不是列名。您应该将参数定义为:

new SelectArg("date", null);

回溯,状态的javadocsWhere.raw()

args - 对应于任何的可选参数?在 rawStatement 中指定。每个参数必须具有相应的 columnName 或 sql-type 集。

您也可以使用SqlType构造函数。我已经改进了文档中的 JavadocsSelectArg来帮助解决这个问题。在 github 上查看此更改。

另外,正如我所提到的,我认为您想要执行以下操作:

SelectArg dateArg = new SelectArg("date", null);
SelectArg endDateArg = new SelectArg("endDate", null);
carsQB.where().raw("CASE WHEN future = true THEN date > ? ELSE endDate > ? END",
    dateArg, endDateArg);
...
dateArg.setValue(...);
endDateArg.setValue(...);
于 2013-03-14T17:09:35.267 回答