本文主要是介绍mybatis框架使用中出现的错误java.lang.NoSuchMethodException,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、参考文章给的方案如下
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();
执行正常,希望大佬们知道原理的留言指点一下
参考文章
这篇关于mybatis框架使用中出现的错误java.lang.NoSuchMethodException的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!