mybatis使用QueryWrapper查询为空的问题,可能是接参的类型为基本变量的数组
2023-09-14 09:07:25 时间
问题来源
今天遇到这样的场景:查询某些服务主体下的所有设备,而某些服务主体的接参类型为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类时,不要用基本变量的数组接参,而是用它们对应的包装类接参,以避免这种问题的出现。
相关文章
- Mybatis和hibernate的优缺点比较
- MyBatis之基于XML的属性与列名映射
- mybatis分页练手
- Spring Boot 整合 Mybatis Annotation 注解的完整 Web 案例
- Mybatis ResultMap Collection 复合主键
- MyBatis Plus使用@TableField(exist = false)标识非数据库字段
- Java SSM篇3——Mybatis
- 分析mybatis的#{}、${}(#绑定变量超过一定值导致Oracle挂掉)
- Atitit sql的执行功能 目录 1. 主要流程1 1.1. 获取conn,执行sql取得结果,1 1.2. Orm类的执行(hb mybatis为例1 2. 常见sql执行框架与类库1
- 【MyBatis笔记01】MyBatis框架介绍以及开发环境搭建
- Spring+SpringMVC+Mybatis(开发必备技能)05、task任务配置
- Spring+mybatis+struts框架整合的配置具体解释
- spring boot + mybatis + mybatis逆向工程 --- 心得
- java单元测试调用mybatis接口并执行
- MyBatis核心武器的源泉
- Mybatis—动态SQL