房间 - 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
)
我现在尝试了三种不同的方法:
- 将参数作为
List<String>
传递
- 将参数作为
String[]
传递
- 最后将参数作为简单的
String
传递,但格式为 (value_1, value_2, ..., value_n)
最后一个应该很容易工作,因为它将(或至少应该)直接转换为 SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n)
,这正是您手动写出 SELECT
的确切方式如果您只是直接访问数据库。
所以当我准备提交这个问题时,我仔细检查了我之前查过的一堆东西,发现了我不知何故遗漏的东西并且可以避免这个问题的必要性。
事实证明,这两个选项:
- 将参数作为
List<String>
传递
- 将参数作为
String[]
传递
是可行的(您可以将 String
替换为数据库可以表示的任何类型,例如 char
或 int
),您只需更改 @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
而不是 array
或 list
:
@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)
)。
是否可以将 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
)
我现在尝试了三种不同的方法:
- 将参数作为
List<String>
传递
- 将参数作为
String[]
传递
- 最后将参数作为简单的
String
传递,但格式为(value_1, value_2, ..., value_n)
最后一个应该很容易工作,因为它将(或至少应该)直接转换为 SELECT * FROM Table WHERE column IN (value_1, value_2, ..., value_n)
,这正是您手动写出 SELECT
的确切方式如果您只是直接访问数据库。
所以当我准备提交这个问题时,我仔细检查了我之前查过的一堆东西,发现了我不知何故遗漏的东西并且可以避免这个问题的必要性。
事实证明,这两个选项:
- 将参数作为
List<String>
传递
- 将参数作为
String[]
传递
是可行的(您可以将 String
替换为数据库可以表示的任何类型,例如 char
或 int
),您只需更改 @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
而不是 array
或 list
:
@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)
)。