gpt4 book ai didi

android - OrmLite Select within select 使用 SelectArg 转义字符

转载 作者:搜寻专家 更新时间:2023-11-01 08:08:28 26 4
gpt4 key购买 nike

我正在使用 QueryBuilder 来构建稍后在原始 SQL 中使用的内部 SQL,以避免手动转义无效字符。

SelectArg friendsIN = new SelectArg(friendsUsernames);
QueryBuilder<MyObject, Integer> qb = myObjectDao.queryBuilder();
qb.selectRaw("username", "MAX(time) AS latestTime").groupBy("username").where()
.in("username", friendsIN);
String innerSelect = pq.getStatement();

friendsUsernames定义为 ArrayList<String> .

然后我使用 innerSelect构建外部选择:

String select = "SELECT w.id FROM (" + innerSelect +") AS x INNER JOIN myObject AS w on w.username = x.username AND w.time = x.latestTime";
GenericRawResults<String[]> results = myObjectDao.queryRaw(select);

但是,正如预期的那样,innerString'?'当我调用 queryRawmyObjectDao我没有得到任何结果。我尝试将 friendsUsername 作为数组提供给 queryRaw:

GenericRawResults<String[]> results =
myObjectrDao.queryRaw(select,
friendsUsernames.toArray(new String[friendsUsernames.size()]));

但是我得到以下错误:

android.database.sqlite.SQLiteBindOrColumnIndexOutOfRangeException:
bind or column index out of range: handle 0x17a22e8

关于如何使用 OrmLite 完成此类查询有什么建议吗?

最佳答案

是的,那是行不通的。只有一个 ?在您的查询中,但您正试图传入一组用户名。 ?的个数一定是一一对应的SQL 参数和传递给 queryRaw(...) 的参数数量方法完全正确。

如果friendsUsernames是固定大小,那么您应该能够执行类似以下的操作,这将生成类似 "in (?, ?, ?, ?)" 的 SQL :

List<SelectArg> friendsInList = new ArrayList<SelectArg>();
for (int i = 0; i < NUM_FRIENDS; i++) {
// it doesn't matter what the value is since you just want the ?
fieldsInList.add(new SelectArg());
}
...in("name", friendsInList);

但是,如果名称列表是动态的,那么您将不得不即时执行此操作,因为 ? 的数量再次增加。必须匹配传递给 queryRaw(...) 的参数数量方法完全正确。

关于android - OrmLite Select within select 使用 SelectArg 转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12172568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com