房间数据库全动态查询

Posted

技术标签:

【中文标题】房间数据库全动态查询【英文标题】:Room database full dynamic query 【发布时间】:2018-06-18 18:15:24 【问题描述】:

我有带有对象硬币的房间数据库。

我想用参数做一个动态查询。

当我将参数用于值时,效果很好,如下所示:

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

【问题讨论】:

不在房间工作导致重复订单 我假设这是 Kotlin 代码并相应地标记了它。如果有错误,请编辑。 您的示例显示为 ORDER BY 子句而不是 WHERE 子句使用参数(绑定值)。 【参考方案1】:

您不能使用绑定变量(参数)来引用 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 语句中添加一个单独的 WHEN 子句,并且您可能需要或想要为 :order 绑定变量不添加的情况添加一个 ELSE 子句匹配您的任何标准情况。

对绑定变量的限制也适用于 where 子句和投影(选择列表)。绑定变量在您的示例中具有自己的值,分别是 String 或 Int 用于 :order 和 :numberOfCoins。

【讨论】:

这行不通。不幸的是,您需要编写单独的查询。【参考方案2】:

以下是 kotlin 语言的示例,说明值如何完全动态化,

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

【讨论】:

@Query("SELECT * FROM Test where testId = :arg0") arg0 - 无法解析 @Vladyslav Ulianytskyi 你能告诉我你的问题吗?这样我就可以知道你遇到了什么问题。 @Query("SELECT * FROM History WHERE date = :date") fun getTodayHistory(date: Date): List 已尝试: WHERE date = Date(:date) 或 WHERE date = date(:date) 但 Date 它不起作用.. @Vladyslav Ulianytskyi 试试这个方法:@Query("SELECT * FROM History WHERE date = :arg0") fun getTodayHistory(date: Date):

以上是关于房间数据库全动态查询的主要内容,如果未能解决你的问题,请参考以下文章

hive从查询中获取数据插入到表或动态分区

Skywalking全链路监控集群和动态部署

Hive 动态分区

Gridview动态绑定数据 分页问题(换页后,显示没有数据)?

可以用动态部分扩展静态 SQL 语句吗?

SqlAlchemy:动态查询