room数据库全动态查询

enxuqcxy  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(732)

我有带硬币的房间数据库。
我想用参数进行动态查询。
当我使用参数作为值时,效果很好,如下所示:

@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>>
1cosmwyk

1cosmwyk1#

不能使用绑定变量(参数)引用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子句,对于:order bind变量与任何标准case都不匹配的情况,您可能需要或想要添加else子句。
对绑定变量的限制也适用于where子句和投影(select list)。bind变量在示例中有自己的值:order和:numberofcoins的string或int。

z3yyvxxp

z3yyvxxp2#

下面是kotlin语言中的示例,说明了值是如何完全动态的,

@Query("SELECT * FROM Test where testId = :arg0")
fun loadTestById(testId: Int): Test

这里test是表名,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>>

相关问题