今天在写项目时碰到一个错误,缺失set关键字,错误代码如下
<update id="updateUnusualGenericConfig">
update EOM_SC_ERR_RULE_CFG
<set>
<if test=" priCoe != null and priCoe != '' ">
PRI_COE = #{priCoe},
</if>
<if test=" isAutoDisp != null and isAutoDisp != '' and ifEffect == 1 ">
IS_AUTO_DISP = #{isAutoDisp},
</if>
<if test=" dispOverdueDays != null and dispOverdueDays != '' ">
DISP_OVERDUE_DAYS = #{dispOverdueDays},
</if>
<if test=" feedbackOverdueDays != null and feedbackOverdueDays != '' ">
FEEDBACK_OVERDUE_DAYS = #{feedbackOverdueDays},
</if>
<if test=" isFeedbackFile != null and isFeedbackFile != '' ">
IS_FEEDBACK_FILE = #{isFeedbackFile},
</if>
<if test=" isFallback != null and isFallback != '' ">
IS_FALLBACK = #{isFallback},
</if>
<if test=" fileOverdueDays != null and fileOverdueDays != '' ">
FILE_OVERDUE_DAYS = #{fileOverdueDays}
</if>
</set>
where
ER_CFG_ID IN
<foreach item="item" collection="erCfgId.split(',')" open="(" separator="," close=")">
#{item}
</foreach>
</update>
</mapper>
报错原因:
sql语句是由mybatis根据条件动态拼接生成的,当需要更新的参数全部为空时,set标签中的if条件全部都不满足,在动态拼接sql时所有参数都没有拼接上,所以导致sql语句拼接出错。
解决办法:
在网上查阅资料发现可以在set属性中对一个永远不会变的字段进行赋值即可解决,但因为我是批量修改,也没办法找到一个不会改变的字段,所以我使用了反射获取所有入参对象中所有带值的字段,并对其判断看入参是否为空,代码如下:
public class UnusualGenericConfigUnitls {
@SneakyThrows(IllegalAccessException.class)
public static boolean isFieldNotNull(Object obj){
//拿到对象的所有字段
Field[] fields = obj.getClass().getDeclaredFields();
//标识
int flag = 0;
//遍历所有字段
for (Field field : fields) {
//开启权限
ReflectionUtils.makeAccessible(field);
//判断是否有值
if (!(field.get(obj) == null || "".equals(field.get(obj)))){
flag += 1;
}
}
return flag>3;
}
}
入参中我确定含有值的为三个,若flag>3,则代表参数不为空,进行修改操作,否则就返回提示信息。