ORMlite QueryBuilder其中A和B和C以及(D或E或F)

时间:2017-05-13 21:38:47

标签: android query-builder ormlite

我不确定我缺少什么,但我并没有想过如何在ORMlite中的QueryBuilder的Where语句中使用or()函数。

我有一个查询,我希望它是:

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匹配的任何行但我需要ABC作为所有行的要求。

我已经查看了or()函数的ORMlite示例代码和描述,但它们似乎都关注(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);

1 个答案:

答案 0 :(得分:2)

好吧,我想我找到了一种方法让它发挥作用,但我不确定这是我应该如何“正确”。如果有更好的方法,请告诉我。

第一个变化是我捕获了最初的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
            )
        );

    }
}