2017-05-13 43 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 
      ) 
     ); 

    } 
} 
相关问题