升级MyBatis Kotlin Dynamic SQL至1.5.0时isIn用法报错求助
MyBatis Kotlin Dynamic SQL 升级问题排查与解决
问题原因分析
旧代码编译失败:
新版本的MyBatis Kotlin Dynamic SQL重构了isIn的API签名,不再支持通过*操作符直接展开列表作为参数的写法,旧API已被移除,导致编译不通过。新代码运行报错:
你写的facility isIn { searchData.selectedFacilities }中,花括号会被框架解析为子查询构建器,而非直接传入列表参数,框架因此要求你在子查询中定义select语句,从而抛出You must specify a select statement in a sub query错误。
解决方法
基础正确写法
直接将Int列表作为参数传入isIn,不要添加花括号:
val fencingForFacilities: List<Fencing> = fencingSupportMapper.select { where { facility isIn searchData.selectedFacilities!! } }
空安全优化写法
考虑到searchData.selectedFacilities可能为空,建议增加空判断避免空指针或生成无效SQL:
val selectedFacilities = searchData.selectedFacilities ?: emptyList() val fencingForFacilities: List<Fencing> = fencingSupportMapper.select { where { if (selectedFacilities.isNotEmpty()) { facility isIn selectedFacilities } else { // 根据业务需求设置默认条件,比如匹配所有或过滤无效数据 facility isNotNull } } }
内容的提问来源于stack exchange,提问作者mikeb
相关产品推荐
相关产品推荐

