Cause: org.apache.ibatis.builder.BuilderException: Ambiguous collection type for property 'emps'. You must specify 'javaType' or 'resultMap'

发布时间 2023-06-06 10:30:53作者: 爱敲代码的小北

错误原因


这个错误通常表示在解析 Mybatis 映射文件(Mapper XML)时出现了问题,可能的原因有两个:

  1. 集合属性缺少 javaType 或 resultMap 属性:该错误信息显示了 "Ambiguous collection type for property 't_emp'. You must specify 'javaType' or 'resultMap'",表明 t_emp 属性的集合类型不明确,需要指定 javaType 或 resultMap。这通常发生在映射文件中的集合属性没有指定 javaType 或 resultMap,并且 Mybatis 无法自动推断出其类型时。要解决这个问题,需要在映射文件中为集合属性添加 javaType 或 resultMap,明确其类型。

  2. 映射文件语法错误:另外一个可能的原因是映射文件中存在语法错误,导致 Mybatis 无法正确解析该文件。在这种情况下,需要仔细检查映射文件的语法是否正确,以及是否存在语法错误。

针对以上原因,你可以参照以下方法进行排查和修复:

  1. 检查集合属性是否指定了 javaType 或 resultMap,如果没有,则添加相应的属性定义。
  2. 检查映射文件是否存在语法错误,例如元素是否正确闭合、属性是否正确赋值等。
  3. 确保 Mybatis 版本与依赖库的版本相匹配,版本不匹配也可能导致解析错误。
  4. 尝试使用 Mybatis 提供的工具进行调试和分析,例如使用 Mybatis Generator 自动生成 Mapper 类或 XML 文件,查看其生成的代码是否符合预期。

示例纠正后的映射文件:

<resultMap id="deptAndEmpResultMap" type="com.north.model.Dept">
  <id property="deptno" column="deptno"/>
  <result property="dname" column="dname"/>
  <result property="loc" column="loc"/>
  <collection property="t_emp" resultMap="empResultMap"/>
</resultMap>

<resultMap id="empResultMap" type="com.north.model.Emp">
  <id property="empno" column="empno"/>
  <result property="ename" column="ename"/>
  <result property="job" column="job"/>
</resultMap>

这里 collection 配置项的 resultMap 属性指向了指定类型的映射配置。

解决方案

吐槽一下自己 : 自己真的有被自己给蠢到 , 写的时候不注意 ????

在实体类当中添加另一个实体类进行封装 , 然后再进行查询

    private Emp emp;

    public Emp getEmp() {
        return emp;
    }

    public void setEmp(Emp emp) {
        this.emp = emp;
    }

最终问题得到解决

查询结果显示 :