2017-05-13 12 views
2

私は何が欠けているのかよく分かりませんが、or()関数をWhereステートメントのORMliteのQueryBuilderORMlite QueryBuilderここでAとBとCと(DまたはEまたはF)

私は、クエリを持っていると私はそれになりたい:

where A and B and C and (D or E or F)

が、どのようなコードが生成されることである。

where (A and B and C and D) or E or F

andD含まなっているだけでなく、 EFはグループ化されていません。つまり、Eと一致するすべての行がretuになります私はAB、およびCがすべての行の要件として必要です。

私はORMliteのサンプルコードとor()関数の説明を見てきましたが、それらはすべて私がしようとしているものではない(A and B) or (C and D)のシナリオに焦点を当てているようです。私はコードが自分の状況でどのように機能するかを調べようとしましたが、それは本当に間違っていますので、私がどのようにしてor()関数を使用していなければならないのか分かりません。

助けが必要ですか?

protected void addWhereClauses(Where<Sheep, Integer> whereClause) throws SQLException { 

    whereClause 
      .eq("owner_id", this.owner.getId()) // A 
      .and() 
      .isNull("markedfordeletiondate") // B 
      .and() 
      .eq("isownedbyme", this.currentlyShowingSheepMine); // C 


    String filterstring = getFilterString(); 
    if (filterstring != null) { 
     filterstring = "%"+filterstring+"%"; 
     whereClause.and() 
       .or(
        whereClause.like("name", filterstring), // D 
        whereClause.like("tag", filterstring), // E 
        whereClause.like("scrapietag", filterstring) // F 
       ) 
     ; 
    } 
} 

編集:私は、私はそれをつかみ、コンソールにそれをログに記録していますので、生成されたクエリがどのようなものか知っている:

String sql = queryBuilder.prepareStatementString(); 
Log.d("BFLF", "sql: "+sql); 
+0

これはそれをどのように生成しているのですか?純粋に結果に基づいて? –

+0

私はクエリビルダが生のSQLを吐き出しているので、デバッグの目的でそれを見ることができます。上記の私の記事を、SQL文のログに使用したコードで更新しました。 –

+0

or()メソッドが多くの引数を取る場合、私は個人的にあなたが持っているものが間違っているのを見ません。 ormliteサイトのバグレポートを作成してみてください。これが実際にバグであれば、別のORMソリューションに切り替えることは可能でしょうか? –

答えて

2

[OK]を、私はそれを動作させるための方法を考え出したと思いますしかし、私はこれがどうやって「適切に」行われているのか分からない。これを行うより良い方法があれば教えてください。

最初の変更点は、最初のABC句を取得し、別のand()句にDEFを含むor()句とともに戻したことです。

protected void addWhereClauses(QueryBuilder<Sheep, Integer> queryBuilder, Where<Sheep, Integer> whereClause) throws SQLException { 

    Where<Sheep, Integer> mainClause = whereClause 
      .isNull("markedfordeletiondate") 
      .and() 
      .eq("isownedbyme", this.currentlyShowingSheepMine); 


    String filterstring = getFilterString(); 
    if (filterstring != null) { 
     String likestring = "%"+filterstring+"%"; 

     whereClause.and(
      mainClause, 
      whereClause.or(
        whereClause.like("name", likestring), // D 
        whereClause.like("tag", likestring), // E 
        whereClause.like("scrapietag", likestring) // F 
      ) 
     ); 

    } 
} 
関連する問題