Android Room持久化库 - 如何查找包含在ID列表中的实体ID?

20

我正尝试在我的DAO中执行以下查询。

   @Query("SELECT * FROM objects WHERE obj_id IN :ids")
   List<Object> queryObjects(List<String> ids);

它给了我这个编译时错误:

Error: no viable alternative at input 'SELECT * FROM objects WHERE obj_id IN :ids'

无论是 List<String> ids,还是 String... idsSring[] ids 都不能正常工作。然而,由于我不知道编译时会有多少个id,因此需要一个列表/数组而不是可变参数。

我该如何使这个SQL查询起作用?


尝试使用String[] - CommonsWare
没起作用 :/. 实际上我又测试了一遍,甚至 String... (vararg) 也不起作用。我想之前发生了一些奇怪的事情,不知何故它编译通过了。 - rgoncalv
@YCF_L,你说的“nativeQuery”是什么意思?我在Room Persistence Library中没有找到类似的内容。 - rgoncalv
抱歉,是我的错,我以为你在使用Spring。 - Youcef LAIDANI
2个回答

74
你需要括号:
@Query("SELECT * FROM objects WHERE obj_id IN (:ids)")
List<Object> queryObjects(List<String> ids);

(顺便说一下,我提交了一个问题,试图在这里得到更好的错误消息)


1
这个链接会帮助你改进你的答案,希望你能接受它 传递参数集合 - Youcef LAIDANI
在 List<Integer> 的情况下,它能正常工作吗?例如: @Query("SELECT * FROM objects WHERE obj_id IN (:ids)") List<Object> queryObjects(List<Integer> ids); - user2980181
@user2980181:我认为这应该可以工作,尽管我个人没有尝试过这种特定的组合。 - CommonsWare
只是想知道,是否可能按照 ID 列表的顺序返回对象列表? - Daniel Spiess
@DanielSpiess:我不知道有没有针对此的SQLite SQL语法。虽然我不能排除这种可能性。 - CommonsWare

2
你可以设置输入列表或输入数组。
然后执行像这样的查询:

例如:String[] ids或List ids

Query = @Query("select * from objects where obj_id in (:ids)")

“Original Answer”翻译成“最初的回答”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接