房间 - Select 以 IN 条件查询?

Room - Select query with IN condition?

是否可以将 SQLite 的 IN 条件用于房间?

我正在尝试 select 我的数据库中的项目列表,其中特定列(在本例中为 TEXT 列)的值与一组过滤器值中的任何一个相匹配.据我所知,这在 SQL 和 SQLite 中很容易完成,只需在 SELECT 语句 (see here) 中添加一个 IN 条件即可。但是,我似乎无法让它与 Room 一起使用。

我不断收到此错误:

Error:(70, 25) error: no viable alternative at input 'SELECT * FROM Table WHERE column IN :filterValues'

(其中DAO的输入@Query-注释方法被调用filterValues

我现在尝试了三种不同的方法:

  1. 将参数作为 List<String>
  2. 传递
  3. 将参数作为 String[]
  4. 传递
  5. 最后将参数作为简单的 String 传递,但格式为 (value_1, value_2, ..., value_n)

最后一个应该很容易工作,因为它将(或至少应该)直接转换为 SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n),这正是您手动写出 SELECT 的确切方式如果您只是直接访问数据库。

所以当我准备提交这个问题时,我仔细检查了我之前查过的一堆东西,发现了我不知何故遗漏的东西并且可以避免这个问题的必要性。

事实证明,这两个选项:

  1. 将参数作为 List<String>
  2. 传递
  3. 将参数作为 String[]
  4. 传递

是可行的(您可以将 String 替换为数据库可以表示的任何类型,例如 charint),您只需更改 @Query 来自这个的注释:

@Query("SELECT * FROM Table WHERE column IN :filterValues")

对此:

@Query("SELECT * FROM Table WHERE column IN (:filterValues)")

简单易行,对吧?

请注意,Room 似乎不支持上面的第三种方法(将参数简单地作为 String 传递,但格式为 (value_1, value_2, ..., value_n)),但这可能不是一件坏事,因为那是困难的方法。

因为我已经把所有的东西都打出来了,所以我想我会把这个问题留下来,以防其他人和我一样难以找到这个解决方案并偶然发现这个问题。

您好,您可以使用此查询:

 @Query("SELECT * FROM user WHERE uid IN(:userIds)")
 public abstract List findByIds(int[] userIds);

 @Query("SELECT * FROM user WHERE uid IN(:userIds)")
 public abstract List findByIds(List<Integer> userIds);

与上述 Kotlin 中的答案类似,您可以使用 vararg 而不是 arraylist:

@Query("SELECT * FROM user WHERE uid IN (:userIds)")
fun getUsers(vararg userIds: Int): List<User>?

并像 repository.getUsers(1, 2, 3) 一样使用它。

如果需要,要将 vararg 转换为 list,请参阅 https://proandroiddev.com/kotlins-vararg-and-spread-operator-4200c07d65e1(使用 *format(output, *params))。