You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 00:07:45