Couchbase Lite 2.8.6 Android端where多and条件查询异常求解
问题根因
你第三次查询的表达式括号匹配错误,导致条件拼接逻辑不符合预期:你提前闭合了内层and()方法的括号,使得timestamp属性的lessThanOrEqualTo比较没有绑定到对应的属性条件上,而是错误作用在了前面的整段表达式上,最终查询条件失效,返回了不符合规则的记录。
修复方案
修改条件拼接的括号位置,保证每个and()方法的参数都是完整的条件表达式即可,参考代码如下:
QueryBuilder.select( SelectResult.property("id"), SelectResult.property("timestamp"), SelectResult.property("rating")) .from(DataSource.database(database)) .where( Expression.property("type").equalTo(Expression.string(DOC_TYPE)) // 每个and连接完整的独立条件,避免括号嵌套错误 .and(Expression.property("rating").lessThan(Expression.intValue(1))) .and(Expression.property("timestamp").lessThanOrEqualTo(Expression.longValue(1))) )
如果习惯用嵌套写法,也可以用以下格式,注意括号的闭合位置:
QueryBuilder.select( SelectResult.property("id"), SelectResult.property("timestamp"), SelectResult.property("rating")) .from(DataSource.database(database)) .where(Expression.property("type").equalTo(Expression.string(DOC_TYPE)) .and( Expression.property("rating").lessThan(Expression.intValue(1)) .and(Expression.property("timestamp").lessThanOrEqualTo(Expression.longValue(1))) ) )
排查技巧
遇到多条件拼接不生效的情况,可以调用查询对象的explain()方法打印执行计划,直接查看实际生成的查询条件是否符合预期,快速定位表达式拼接错误。
内容的提问来源于stack exchange,提问作者Vitalii
相关产品推荐
相关产品推荐

