【问题标题】:ORMlite QueryBuilder Where A and B and C and (D or E or F)ORMlite QueryBuilder where A and B and C and (D or E or F)
【发布时间】:2017-05-13 21:38:47
【问题描述】:

我不确定我错过了什么,但我不知道如何在 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 匹配的任何行,但我需要 AB , 和 C 作为所有行的要求。

我查看了 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);

【问题讨论】:

  • 你怎么知道它正在生成它?纯粹基于结果?
  • 我让查询生成器吐出原始 SQL,以便我可以查看它以进行调试。我用我用来记录 sql 语句的代码更新了我上面的帖子。
  • 如果 or() 方法有很多参数,我个人看不出你有什么问题。尝试在 ormlite 网站上提交错误报告?如果这实际上是一个错误,是否可以切换到另一个 ORM 解决方案?

标签: android query-builder ormlite


【解决方案1】:

好的,我想我想出了一个让它工作的方法,但我不确定我应该如何“正确”地做到这一点。如果有更好的方法,请告诉我。

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

    }
}

【讨论】:

    猜你喜欢
    • 2011-06-13
    • 2015-11-29
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2012-10-10
    相关资源
    最近更新 更多