1

このクエリを ORMLite で実行しようとしていますが、or() ステートメントを適切に使用できません。

SELECT DISTINCT x FROM xx INNER JOIN xw w WHERE :date >= x.startDate AND w.company.id = :companyId AND w.status = :status AND x.status = :status AND (x.endDate = NULL OR x.終了日 >= :日付)

私のコード:

QueryBuilder<x, Integer> xQB = this.xDao.queryBuilder();
xQB.where().eq("status", StatusEnum.ENABLED).and().le("startDate", date)
.and().ge("endDate", date).or().isNull("endDate");

date が startDate より前の場合、この状態は null に等しい endDate の値を返します。or() ステートメントを削除すると、すべて正常に動作します。

ありがとう。

4

1 に答える 1

6

ANDとグループ化について混乱しているように感じますOR。任意のand()oror()操作 (引数なし) は、スタックの前の要素を取得し、それを次の引数と結合してから、結果をスタックにプッシュします。したがってa AND b AND c OR e、およそ になり(((a AND b) AND c) OR e)ます。

このWhereクラスには、比較を括弧で囲む引数を取るメソッドもand(...)あります。or(...)これは、比較対象の 2 つを明示する必要がある場合のような状況で役立ちます。私はあなたのものを次のように変更します:

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 AND (b AND (c OR d)))' が生成されるはずです。

クエリを作成するさまざまな方法については、次のドキュメントをご覧ください。

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

于 2013-03-13T13:05:56.197 に答える