问题来源
今天遇到这样的场景:查询某些服务主体下的所有设备,而某些服务主体的接参类型为int数组,即为int[] serviceSubjectIds
。前端发出查询请求,后台断点看到,是有参数值的,如图所示:
由于代码已作改动,特使用
int[] ssIds
模拟传参
但结果集始终为空,而项目今天又上线,于是,抓紧去排查问题。
排查思路
- 首先排除接参为空的问题
- 根据当前服务主体的参数值,使用原生的SQL语句去数据库查询,查询结果是有设备的,如SQL和下图所示
-- 由于涉及到公司机密,表名以table_name形式命名
SELECT
virtualId 设备Id,
no 设备编号
FROM
table_name
WHERE
( isRemoved = 0 AND serviceSubjectId IN ( 79,415 ) )
故而,排除当前服务主体无设备的问题
-
排查是否为myBatis生成的SQL语句有问题
- 第一步,使用postman传参
- 第二步,查看返回结果
- 结果为空,预测mybatis生成的SQL语句有问题,打印生成的SQL语句
// 由于涉及到公司机密,表名以table_name形式命名,并不返回这么多字段,
Preparing: SELECT virtualId,no FROM table_name WHERE (isRemoved = 0 AND serviceSubjectId IN (?))
Parameters: [I@4b4d3788(int[])
Total: 0
从上面的Parameters
参数来看,占位符 ? 指示的值是:I@4b4d3788
,这明显是一个引用地址,自然查询不到结果,替换占位符,得到SQL语句为
SELECT virtualId,no FROM table_name WHERE (isRemoved = 0 AND serviceSubjectId IN (I@4b4d3788))
因而,查询结果肯定为空,即展示的total为0,也就是0条数据
- 猜测:可能是基本变量的数组
[]int
接参有问题
于是,使用int的包装类来接参,即Integer[] serviceSubjectIds
,依旧使用postman来传参,重新打印mybatis生成的SQL语句。
这次打印出的mybatis所生成的SQL语句:
// 由于涉及到公司机密,表名以table_name形式命名,并不返回这么多字段,
Preparing: SELECT virtualId,no FROM table_name WHERE (isRemoved = 0 AND serviceSubjectId IN (?))
Parameters: 79(Integer), 415(Integer)
Total: 7
从这个SQL语句看,占位符 ?所指示的值为,79,415,替换占位符,得到SQL语句:
SELECT virtualId,no FROM table_name WHERE (isRemoved = 0 AND serviceSubjectId IN (79, 415))
和原生的SQL语句是一致,自然能得到7条数据,即total为7
因而,mybatis生成的SQL语句没有问题,是我们接参的类型有问题,不应该使用基本变量的数组来接参,而是它们对应的包装类。
总结
- 遇到问题切勿慌张,预测会有哪几个环节出现了问题,列出出现问题的可能性,然后一步一步演示验证。
- 在使用mybatis框架的queryWrapper类时,不要用基本变量的数组接参,而是用它们对应的包装类接参,以避免这种问题的出现。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99221.html