Kotlin中IN子句多值参数传递方法及查询失败原因排查
解答你的Kotlin SQL IN子句问题
嘿,这两个问题其实是同一个核心原因导致的,我给你一步步讲清楚:
为什么传"'type1','type2'"会返回空结果?
当你把字符串"'type1','type2'"作为参数传给DAO时,SQL会把这个整个字符串当成一个单一的值去匹配Qtype字段。也就是说,它在找Qtype等于'type1','type2'(注意这是一个完整的字符串,包含引号和逗号)的行,但你的数据库表里根本没有这样的Qtype值,所以自然查不到结果。
SQL参数绑定的逻辑是把传入的参数作为整体处理,不会去解析你字符串里的逗号和引号,所以这种拼接字符串的方式完全行不通,还可能带来SQL注入的风险。
正确的做法:用List作为参数传递多个值
从你的DAO注解来看应该是用了Room数据库框架,它支持直接用List<String>作为IN子句的参数,会自动帮你把List转换成SQL需要的格式。
步骤1:修改DAO方法的参数类型
把原来的String参数改成List<String>:
@Query("SELECT * FROM tabledata WHERE Subject='English' AND Qtype IN(:types)") suspend fun engquest(types: List<String>): List<quizdata>
步骤2:在调用处传入List对象
在main.kt里直接传入包含多个值的List,而不是拼接字符串:
val types = listOf("type1", "type2") val sq = runBlocking { qdatabase(applicationContext).getquizdao().engquest(types).shuffled() }
这样Room会自动生成正确的SQL语句,把List里的元素拆成IN('type1','type2')的格式,就能精准匹配到Qtype为type1和type2的行了。
内容的提问来源于stack exchange,提问作者bilal jamil
相关产品推荐
相关产品推荐

