2013-03-14 22 views
4

我需要在我的查詢的WHERE條件中實現一個CASE。 我寫了下面的代碼:如何在原始查詢中正確定義SelectArg?

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 

日期和結束日期都在我的數據庫日期列。

我錯過了什麼?有沒有更好的方法來完成這一點? 謝謝!

回答

5

問題是(不幸地)呼叫new SelectArg(String)調用SelectArg(Object) constructor它設置而不是列名稱。而應該定義的參數如下:

new SelectArg("date", null); 

原路返回時,javadocs for Where.raw()狀態:

args - Optional arguments that correspond to any ? specified in the rawStatement. Each of the arguments must have either the corresponding columnName or the sql-type set.

您也可以使用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(...); 
+0

真棒感謝灰色!但現在我該如何設置2日期參數? – 2013-03-14 17:21:21

+0

對不起,我忘了解決@MarcoMatarazzi。我編輯了我的答案。 – Gray 2013-03-14 17:24:27

+0

我在回答@MarcoMatarazzi時有點失望。編輯。 – Gray 2013-03-14 19:21:17