mybatis框架使用中出现的错误java.lang.NoSuchMethodException
使用Mybatis的标签进行一对一查询,标签嵌套在标签里面。标签使用select属性调用写好的映射文件中的方法selectMovieNameByID,这个方法需要一个Integer的参数,通过column来传递,但是mm(m.mid的别名)是int类型,而selectMovieNameByID需要一个Integer的参数,所以发生错误。把方法的类型限定删除,方法在执行时就会自动检测参数的类型。执行
·
一、参考文章给的方案如下
java.lang.NoSuchMethodException

- 问题描述:
使用Mybatis的标签进行一对一查询,标签嵌套在标签里面。标签使用select属性调用写好的映射文件中的方法selectMovieNameByID,这个方法需要一个Integer的参数,通过column来传递,但是mm(m.mid 的别名)是int类型,而selectMovieNameByID需要一个Integer的参数,所以发生错误。

- 解决方案:

把方法的类型限定删除,方法在执行时就会自动检测参数的类型。另外:${}传递的是字符,这样会导致类型不匹配,可以采用#{变量}的占位符,这样可以对应相应的变量类型。
二、我是基于注解的方式
@Select("select * from t_emp where deptId = #{id}")
List<Emp> selectEmpByDeptId(@Param("id") Long id);
@Mapper
public interface DeptMapper extends BaseMapper<Dept>{
@Select("SELECT * FROM t_dept WHERE id = #{id}")
@Results(id="deptMap",
value={
@Result(column="id", property="id",id=true),
//等号右侧的id是查出来的数据,赋给selectEmpByDeptId方法中的id参数,去查询对应的信息(右边赋值给左边)
@Result(column="{id = id}",property="listEmp",//将查询到结果映射到java属性listEmp
//这里要写的是子查询的路径,而不是sql语句,同时,子查询可以复用父查询的colum参数
many=@Many(select="com.cxm.validation.mapper.EmpMapper.selectEmpByDeptId"))
})
Dept selectInfoAndMeta(@Param("id") Long id);
}
@TableName(value = "t_dept")
@Data
public class Dept {
@TableId(type= IdType.AUTO)
private Long id;
@TableField("deptName")
private String deptName;
@TableField("address")
private String address;
@TableField("CEO")
private String CEO;
@TableField(exist = false)
//不参与json序列化
@JsonInclude(value= JsonInclude.Include.NON_NULL)
private List<Emp> listEmp;
}
报错如下:
根据上面,删除如下,把方法的类型限定删除,方法在执行时就会自动检测参数的类型:
@Select("select * from t_emp where deptId = #{id}")
List<Emp> selectEmpByDeptId();
执行正常,希望大佬们知道原理的留言指点一下
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)