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コンストラクターも使用できます。SelectArgこれを支援するために、ドキュメントの Javadoc を改善しました。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 に答える