最近写业务代码时,碰到了一件怪事,sql里的if条件怎么都不生效,具体如下
int selectFirstPriority(Map<String, Integer> map);
场景是数据库里status分为0和1.第一次想查询status为1的数据里的最小优先级。第二次查询所有数据的最小优先级,于是写了如下语句
<select id="selectFirstPriority" resultType="int" parameterType="map">
select sortPriority
from tableA
where 1=1
<if test="flag != null and flag = 1">
and status = 1
</if>
order by sortPriority
limit 1;
</select>
一开始是这么写的
int i = businessSlotMapper.selectFirstPriority(new ParameterMap<String, Integer>().put("flag", 1));
xxxx
int newPriority = businessSlotMapper.selectFirstPriority(new HashMap());
执行到第一个select时,因为将flag放进了map里,所以正确执行了sql语句。但是执行第二个select时,发现if语句没有生效,查询出来的依然只是状态为1的最小优先级。
然后我就开始debug,猜测是不是因为加了transactional的缘故,导致在一个事务内操纵同一条select就会忽略限制条件。
于是我将两条sql语句换了个位置,变成这样
int newPriority = businessSlotMapper.selectFirstPriority(new HashMap());
xxxx
int i = businessSlotMapper.selectFirstPriority(new ParameterMap<String, Integer>().put("flag", 1));
这个时候执行到第一个select时,控制台打印出的sql语句如下
==> Preparing: select sortPriority from tableA where 1=1 and status = 1 order by sortPriority limit 1;
整个if竟然直接就失效了。非常奇怪
在这里记录一下,后期跟踪
若有大佬指导,感激不尽