目前使用SSM框架一个星期,发现了一个问题,但只要实用一点小技巧,这个问题就能非常简单的解决,而且省了很多代码。
1、起源
mapper.xml的动态查询很方便也很强大,就比如这样:
<select id="queryFromYear" resultMap="BaseResultMap">
select * from quota_core_data
where i_id in
(
select i_id from quota_core_info
<where>
<if test="year!=null">
and i_year=#{year}
</if>
</where>
)
<if test="sort!=null and order!=null">
order by ${sort} ${order}
</if>
<if test="start!=null and size!=null">
limit #{start},#{size}
</if>
</select>
使用if标签判断来拼装sql,这个想法很好,但是实际使用中我发现一直报错:Optional int parameter 'page' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type.
意思是null不能转成int型,为什么会这样呢?我先不说,dao层、service层、controller层代码如下:
dao层:
List<QuotaCoreData> queryFromYear(@Param("year")int year,
@Param("sort")String sort,@Param("order")String order,
@Param("start")int start,@Param("size")int size);
service层:
public List<QuotaCoreData> queryFromYear(int year,String sort,String order,int start,int size) {
return coreDataMapper.queryFromYear(year,sort,order,start,size);
}
controller层:
@RequestMapping(value="/quotaCoreData",method=RequestMethod.GET)
public List<QuotaCoreData> query(int year,String sort,String order,int page,int rows) {
List<QuotaCoreData> coreDatas=coreDataSer.queryFromYear(year,ColumnName.transToUnderline(sort),order,page,rows);
return coreDatas;
}
我访问的UIL是:
<a href="/quota/quotaCoreData?year=2016">核心指标数据表(接口)</a>
2、解释
当访问时没有带上全部参数时,没有带上的参数就会变为空,但是controller的方法参数为int型就会导致这个错误,因为int没有null,只有0,所以解决办法也很简单,把所有的int型参数改成Integer型参数。三层代码如下:
dao层:
List<QuotaCoreData> queryFromYear(@Param("year")Integer year,
@Param("sort")String sort,@Param("order")String order,
@Param("start")Integer start,@Param("size")Integer size);
service层:
public List<QuotaCoreData> queryFromYear(Integer year,String sort,String order,Integer start,Integer size) {
return coreDataMapper.queryFromYear(year,sort,order,start,size);
}
controller层:
@RequestMapping(value="/quotaCoreData",method=RequestMethod.GET)
public List<QuotaCoreData> query(Integer year,String sort,String order,Integer page,Integer rows) {
List<QuotaCoreData> coreDatas=coreDataSer.queryFromYear(year,ColumnName.transToUnderline(sort),order,page,rows);
return coreDatas;
}
这样问题就解决了。
测试成功:
3、结论
如果不换成Integer的话,就要写很多判断防止空指针的问题,而Integer是复杂数据类型可以为null,这样就可以把null一直带到mapper.xml中,什么代码也不用写,是不是很简单