2017-05-13 73 views
2

我不確定我錯過了什麼,但我沒有關於如何在Where語句中使用or()函數Query中的ORMlite。ORMlite 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

不僅D越來越附帶and條款,但EF未分組,意味着任何匹配E的行將被retu但我需要ABC作爲所有行的要求。

我已經看過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

好吧,我想我想出了一個辦法,使工作,但我不確定這是如何「適當地」做到的。請讓我知道是否有更好的方法來做到這一點。

第一次更改是我捕獲了最初的ABC子句,並將它們傳遞迴另一個and()子句以及一個or()子句,其中包含DEF。

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 
      ) 
     ); 

    } 
} 
相關問題