ORMlite QueryBuilder 其中 A 和 B 和 C 和(D 或 E 或 F)
ORMlite QueryBuilder Where A and B and C and (D or E or F)
我不确定我遗漏了什么,但我并没有摸索如何在 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
子句中,而且 E
和 F
未分组,这意味着匹配 E
的任何行都将被退回,但我需要 A
、B
和 C
作为所有行的要求。
我查看了 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);
好的,我想我想出了一个方法让它工作,但我不确定我应该这样做"properly."如果有更好的方法请告诉我这样做。
第一个变化是我捕获了最初的 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
)
);
}
}
我不确定我遗漏了什么,但我并没有摸索如何在 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
子句中,而且 E
和 F
未分组,这意味着匹配 E
的任何行都将被退回,但我需要 A
、B
和 C
作为所有行的要求。
我查看了 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);
好的,我想我想出了一个方法让它工作,但我不确定我应该这样做"properly."如果有更好的方法请告诉我这样做。
第一个变化是我捕获了最初的 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
)
);
}
}