今天在做一个查询接口,应用场景是统计选择日期范围内的每日数据量,于是便想到了使用count()函数来统计总行数来代表数据量,并且以记录时间的字段来作为分组标准(group by),大体思路有了之后便开始动手编写。在navicat中运行sql语句可以查出结果,但是在xml文件中执行之后却无法得到结果,通过debug调试后,我发现该查询方法返回的竟全部是null
All elements are null
排查掉sql语句编写错误、传参错误等情况后,我就猜测是不是数据接收错误,于是排查了VO类的数据类型的可能性
@Data
public class VO {
private String date;
private Long count;
}
排查后发现不是数据类型的问题,最终锁定是select标签中我写成了resultType来接收结果,换成resultMap来接收之后就可以了!
<select id="countDaily" resultMap="countDailyMap">
select
DATE_FORMAT(time,'%Y-%m-%d') as d,
count(*)
from a
where del_flag = 0
and
DATE_FORMAT(time,'%Y-%m-%d') BETWEEN #{beginDate} AND #{endDate}
GROUP BY d;
</select>
<resultMap id="countDailyMap" type="VO">
<result property="date" column="d"/>
<result property="count" column="count(*)"/>
</resultMap>
下面是mapper接口定义的方法
List<DailyVO> countDaily(@Param("beginDate") String beginDate,@Param("endDate") String endDate);
总结: mybatis框架做查询非字段类型的参数时,可以定义resultMap来接收