You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Room数据库@RawQuery使用IN/NOT IN子句查询不生效如何解决

问题原因

你当前代码出错的核心是:IN子句需要和入参数量匹配的占位符,你写死了单个?,Room会把传入的long数组整体识别为单个参数,无法匹配多ID查询的语法要求,自然得不到正确结果。

正确的@RawQuery实现方案

你需要动态生成和数组长度匹配的占位符,再把数组每个元素作为独立参数传入,修改后的loadAllUserListByIds方法如下:

public default List<UserTable> loadAllUserListByIds(long[] userIds) {
    // 空数组提前返回空结果,避免后续SQL语法错误
    if (userIds == null || userIds.length == 0) {
        return new ArrayList<>();
    }
    // 动态生成对应数量的占位符,比如数组长度为2就生成 ?,?
    String placeholders = String.join(",", Collections.nCopies(userIds.length, "?"));
    String selectQuery = "SELECT * FROM UserTable WHERE userId IN (" + placeholders + ")";
    
    // 直接传入long数组作为参数,Room会按顺序绑定每个ID到占位符
    SimpleSQLiteQuery simpleSQLiteQuery = new SimpleSQLiteQuery(selectQuery, userIds);
    return loadAllUserListByGivenIds(simpleSQLiteQuery);
}
更简便的替代方案(无需使用RawQuery)

如果你的场景没有必须使用@RawQuery的特殊要求,Room的普通@Query原生支持IN子句传入数组/集合参数,不需要自己拼接SQL,写法更简洁:

@Query("SELECT * FROM UserTable WHERE userId IN (:userIds)")
List<UserTable> loadAllUserListByIds(long[] userIds);

直接定义上述接口方法即可,不需要自行实现default方法,Room会自动处理占位符生成和参数绑定逻辑。

内容的提问来源于stack exchange,提问作者Mayur Misal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:57:02