房间数据库全动态查询
Room database full dynamic query
我有带对象币的房间数据库。
我想做一个带参数的动态查询
当我将参数用作值时,效果很好,如下所示:
@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>>
您不能使用绑定变量(参数)来引用 ORDER BY 子句中的列。但是,您可以像这样在表达式中使用绑定变量:
@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 语句中为每个要作为排序依据的 column/expression 添加一个单独的 WHEN 子句,并且您可能需要或想要为 :order 绑定的情况添加一个 ELSE 子句变量与您的任何标准案例都不匹配。
绑定变量的限制也适用于 where 子句和投影(select 列表)。绑定变量在您的示例中有自己的值,分别为 :order 和 :numberOfCoins 的 String 或 Int。
以下是 kotlin 语言中值如何完全动态的示例,
@Query("SELECT * FROM Test where testId = :arg0")
fun loadTestById(testId: Int): Test
这里的Test是表名,testId是应用WHERE子句的字段,
testId 是传递给函数 loadTestById() 的参数,return 类型是名为 Test.
的数据模型 class
Query("select * from coin ORDER BY order=:arg0 asc limit numberOfCoins=:arg1")
fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>>
我有带对象币的房间数据库。
我想做一个带参数的动态查询
当我将参数用作值时,效果很好,如下所示:
@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>>
您不能使用绑定变量(参数)来引用 ORDER BY 子句中的列。但是,您可以像这样在表达式中使用绑定变量:
@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 语句中为每个要作为排序依据的 column/expression 添加一个单独的 WHEN 子句,并且您可能需要或想要为 :order 绑定的情况添加一个 ELSE 子句变量与您的任何标准案例都不匹配。
绑定变量的限制也适用于 where 子句和投影(select 列表)。绑定变量在您的示例中有自己的值,分别为 :order 和 :numberOfCoins 的 String 或 Int。
以下是 kotlin 语言中值如何完全动态的示例,
@Query("SELECT * FROM Test where testId = :arg0")
fun loadTestById(testId: Int): Test
这里的Test是表名,testId是应用WHERE子句的字段, testId 是传递给函数 loadTestById() 的参数,return 类型是名为 Test.
的数据模型 classQuery("select * from coin ORDER BY order=:arg0 asc limit numberOfCoins=:arg1")
fun getAllTop(order: String, numberOfCoins: Int): Flowable<List<CoinDB>>