Parameter 'attendance' not found. Available parameters are [param1, attendance, sid, param2]解决方法

本文记录了一次在项目中遇到的MyBatis参数未找到异常的解决过程。问题出现在传递多个参数时,尝试使用@Param注解和#{0},#{1}方式均未奏效。最终通过将参数整合到一个实体类中解决了问题,添加了Attendance实体类的sid属性,并相应修改了dao层和其他层的代码,成功插入数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一下今天做项目出现的问题以及解决方案。

一.项目的部分代码

  1. pojo层
public class Attendance {
    private Integer id;
    private Staff staff;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(timezone = "GMT-8",pattern = "yyyy-MM-dd")
    private Date adate;
    private String type;
    private String remarks;

	public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Staff getStaff() {
        return staff;
    }

    public void setStaff(Staff staff) {
        this.staff = staff;
    }

    public Date getAdate() {
        return adate;
    }

    public void setAdate(Date adate) {
        this.adate = adate;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getRemarks() {
        return remarks;
    }

    public void setRemarks(String remarks) {
        this.remarks = remarks;
    }

	@Override
    public String toString() {
        return "Attendance{" +
                "id=" + id +
                ", staff=" + staff +
                ", adate=" + adate +
                ", type='" + type + '\'' +
                ", remarks='" + remarks + '\'' +
                '}';
    }
  1. dao层
public interface AttendanceDao {

	@Insert(value = "insert into attendance(id,sid,adate,type,remarks) values(default,#{sid},#{adate},#{type},#{remarks})")
    int insAttendance(@Param("sid")Integer sid,@Param("attendance")Attendance attendance);
}
  1. service和serviceImpl层略(因为都差不多)
  2. controller层
public class AttendanceController {
	@Autowired
    private AttendanceService attendanceService;

	@RequestMapping(value = "/attendanceAdd")
    public ModelAndView attendanceAdd(ModelAndView mv, Attendance attendance,@RequestParam("attdate") String attdate,
                                      String name,Integer did){
        Staff staff = attendanceService.selByNameDid(name, did);
        if(staff!=null){
            attendance.setAdate(Date.valueOf(attdate));
            attendanceService.insAttendance(staff.getId(),attendance);
            mv.setViewName("redirect:/attendance/attendance-list/select");
        }else{
            mv.addObject("msg","alert('该用户不存在,请检查输入的姓名和部门名称是否正确!')");
            mv.setViewName("/right");
        }
        return mv;
    }

二.解决过程

  1. 起初看了一些csdn相关的文章,因为传递的参数较多所以出现这种异常。解决方案有两种。
    第一种使用@Param参数,
    第二种用#{0},#{1}。
    以上方法第一种我就是使用注解来让mybatis识别的,但还是出现这种错误!
    第二种更不可能,我传递的有对象肯定不能以这种方式。
    还有一种说法@Param注解导包问题,导入的是mybatis的而不是spring下的,在这里我导入的是org.apache.ibatis.annotations.Param也没有问题。
    这就很奇怪了!!!
  2. 然后就看到了这篇文章,算是已有一些启发https://blog.youkuaiyun.com/xu1227233860/article/details/77387088
    因为我想我这里也就额外添加了一个参数,为什么不把它放在同一个实体类中呢?
    在Attendance实体类中新加入一个私有属性sid,加上get/set方法,而dao层接口中自然也就变成了int insAttendance(Attendance attendance); ,其他层的代码相继稍微修改一下。
    结果一试,插入数据成功了!到现在我还是实在想不明白为什么添加注解也无法插入成功,有机会一定要问问大佬。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值