我需要在查询的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

日期和结束日期都是数据库中的日期列。
我错过了什么?有没有更好的方法来实现这一点?
谢谢!

最佳答案

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

new SelectArg("date", null);

要回溯,javadocs for Where.raw()状态:
args-与任何参数对应的可选参数?在rawstatement中指定。每个参数都必须具有相应的columnname或sql类型集。
您还可以使用SqlType构造函数。我已经改进了SelectArg文档上的javadocs来帮助解决这个问题。参阅this change on 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(...);

09-11 21:36