我有对象硬币的房间数据库。
我想用参数进行动态查询。
当我使用参数作为值时,它的效果很好,如下所示:
@Query("select * from coin ORDER BY percent_change_24h asc limit :numberOfCoins")
fun getAllTop(numberOfCoins: Int): Flowable<List<CoinDB>>
但是当我想为WHERE子句使用参数时,这不起作用。 这是我的疑问:
@Query("select * from coin ORDER BY :order asc limit :numberOfCoins")
fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>>
我称之为:
AppDatabase.getInstance(this).coinDao().getAllTop("percent_change_24h",5)
使用隐式WHERE子句调用相同的查询可以正常工作(如下所示:)
@Query("select * from coin ORDER BY percent_change_24h asc limit :numberOfCoins")
fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>>
答案 0 :(得分:13)
您不能使用绑定变量(参数)来引用ORDER BY子句中的列。但是,您可以在表达式中使用bind变量:
@Query("select * from coin ORDER BY
CASE :order
WHEN 'percent_change_24h' THEN percent_change_24h
WHEN 'other_column_name' THEN other_column_name
END asc limit :numberOfCoins")
fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>>
对于要排序的每个列/表达式,您需要为CASE语句添加单独的WHEN子句,并且您可能需要或者想要为以下情况添加ELSE子句:order bind变量不对其进行排序。 ; t匹配任何标准情况。
绑定变量的限制对于where子句和投影(选择列表)也适用。绑定变量在您的示例中具有自己的值,分别为String或Int:order和:numberOfCoins。
答案 1 :(得分:3)
以下是科特林语言中的示例,说明了如何使值完全动态
@Query("SELECT * FROM Test where testId = :arg0")
fun loadTestById(testId: Int): Test
这里Test是tableName,testId是应用WHERE子句的字段, testId是传递给函数loadTestById()的参数,返回类型是名为Test的数据模型类。
Query("select * from coin ORDER BY order=:arg0 asc limit numberOfCoins=:arg1")
fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>>