【问题标题】:Why the sql statement is wrong and the room does not report an errorsql语句错误为什么房间不报错
【发布时间】:2023-02-08 20:21:15
【问题描述】:

@Query("SELECT * FROM t_user ORDER BY :order DESC")
    fun pagingSource(order: String): PagingSource<Int, User>

我现在知道sql语句不能把columnName作为参数。但是为什么Room没有报错,还是成功查询到了结果。只不过不是按照id倒序排列,而是顺序排列。

日志打印也是正确的sql语句。

// AppDatabase
Room.databaseBuilder(...).setQueryCallback({ sqlQuery, bindArgs ->
                Log.d("Android Room", "SQL Query: $sqlQuery SQL Args: $bindArgs")
            }, 
...

// logcat
SQL Query: SELECT * FROM ( SELECT * FROM t_user ORDER BY ? DESC ) LIMIT 60 OFFSET 0 SQL Args: [id]

你能告诉我 Room 是如何处理这个 sql 语句的吗?

【问题讨论】:

    标签: android sqlite android-sqlite android-room


    【解决方案1】:

    我现在知道sql语句不能把columnName作为参数

    正确,但在您的情况下,参数未被解释为列的名称,而是解释为文字字符串,例如 'id' 并且由于文字字符串和表达式在 ORDER BY 子句中有效并被接受,因此您的查询被解析并解释为:

    select * from t_user order by 'id';
    

    这是不是语法错误,但当然不会执行所需的排序。

    请参阅demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多