一、参考文章给的方案如下

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();

执行正常,希望大佬们知道原理的留言指点一下

参考文章

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐