spring依赖注入成功但在调用接口的时候拿到的依赖却是null
一、问题描述:
在一个查询的场景里传递了一个list作为参数传到sql中查询,查询完后这个参数再次传递到下一个方法中查询却发现对应的list已经变成了null。
二、问题代码:
<if test="param.list1 == null and param.list2 = null and param.list2.size > 0">
AND t.id in
<foreach collection="param.list1" item="item" separator="," open="(" close=")">
#{item}
</foreach>
</if>
咋一看,这段代码没什么问题但现实却把list2清空了。
三、问题所在:
眼尖的同学可能已经找到问题所在了,在做判断的时候有个地方 == 写成了 = 所以做了一个赋值操作,导致list2直接被赋值为null了。(粗心大意所致!!警醒)
四、注意:
这里并不是在ONGL表达式中写错了把==写成=才会把对应参数给修改掉。这里我分别做了几次实验,发现如果是单纯传入参数查询写成赋值= 就不会被修改,只会造成bug(别问我为啥)。具体测试相关代码及结果如下:
dao层
public interface TestDao {
public Date testQueryWithDto(@Param("param") ParamDto param);
public Date testQueryList(@Param("list1") List<String> list1,@Param("list2") List<String> list2);
}
xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.dao.TestDao">
<select id="testQueryWithDto" resultType="java.util.Date">
select now() from dual
<where>
1=1
<if test="param.list1 != null and param.list2 = null">
and 1=1
</if>
<if test="param.testParam = null">
and 1=1
</if>
</where>
</select>
<select id="testQueryList" resultType="java.util.Date">
select now() from dual
<where>
1=1
<if test="list1 != null and list2 = null">
and 1=1
</if>
</where>
</select>
</mapper>
测试类
@MapperScan(basePackages = "com.example.demo.dao")
@SpringBootTest
class DemoApplicationTests {
@Autowired
private TestDao testDao;
@Test使用dto传入参数不小心写错
void test() {
List<String> list1 = Lists.newArrayList("1", "2", "3", "4", "5", "5");
List<String> list2 = Lists.newArrayList("1", "2", "3", "4", "5", "5");
//Dto方式传入参数查询
ParamDto paramDto = new ParamDto();
paramDto.setList1(list1);
paramDto.setList2(list2);
paramDto.setTestParam("测试的参数");
System.out.println("执行sql前参数为:" + paramDto);
System.out.println(testDao.testQueryWithDto(paramDto));
System.out.println("执行sql后参数为:" + paramDto);
//直接传入list方式查询
System.out.println("===========================================================================================");
List<String> l1 = Lists.newArrayList("1", "2", "3", "4", "5", "5");
List<String> l2 = Lists.newArrayList("1", "2", "3", "4", "5", "5");
System.out.println("执行sql前参数为:" + l1 + "," + l2);
System.out.println(testDao.testQueryList(l1, l2));
System.out.println("执行sql后参数为:" + l1 + "," + l2);
}
}
测试结果:
使用dto传入参数不小心写错
直接传入参数
五、本文如若有不妥之处,请及时联系我进行更正,以便误导。
1、QQ:646116940;
2:探讨群:976519455