将一个List和查询条件作为参数入参进行查询时,使用了Map封装,查询居然报错
深入查看后发现,在Mapper方法传参时使用了Map加@Param两个参数,
public List<Bill> selectBillListByCode_ProId_foreach_map(@Param("productCode")String productCode,Map<String, int> ProIdMap);
而xml文件SQL语句是
<select id="selectBillListByCode_ProId_foreach_map" resultMap="BillList">
SELECT `billCode`,`productName` FROM `smbms_bill` WHERE `providerId`
IN
<foreach collection="MapKey" item="ProIdMap" open="(" separator="," close=")">
#{ProIdMap}
</foreach>
<if test="productCode != null and productCode != ''">
and `billCode` LIKE CONCAT ('%',#{productCode},'%')
</if>
</select>
本以为含Map多参数会和Map单参数一样不需要注解
所以此处会执行时会报错
正确写法是将方法的Map前加上@Param且在sql语句引用参数,Map前面需要加名称前缀
public List<Bill> selectBillListByCode_ProId_foreach_map(@Param("productCode")String productCode,Map<String, int> ProIdMap);
<select id="selectBillListByCode_ProId_foreach_map" resultMap="BillList">
SELECT `billCode`,`productName` FROM `smbms_bill` WHERE `providerId`
IN
<foreach collection="map.MapKey" item="map.ProIdMap" open="("
separator="," close=")">
#{map.ProIdMap}
</foreach>
<if test="productCode != null and productCode != ''">
and `billCode` LIKE CONCAT ('%',#{productCode},'%')
</if>
</select>
第二种方法,由于MyBatis接收参数时,无论参数数量,类型,都会将参数放入Map中,所以我们可以将所需的其他参数一并封装入Map
public List<Bill> selectBillListByCode_ProId_foreach_map(Map<String, Object> ProIdMap);
引用参数时是使用Map中的Key进行选择