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
相关产品推荐
相关产品推荐

