java - mybatis一对一关联查询出错Could not find result map
阿神
阿神 2017-04-17 17:23:40
[Java讨论组]

1.问题:mybatis一对一关联查询报错 org.apache.ibatis.builder.IncompleteElementException: Could not find result map,但是无轮建表,到sql查询均可以查询到,请问哪里出问题了?

  • SQL建表如下:

# 创建teacher 与 class 表
CREATE TABLE IF NOT EXISTS teacher(
  t_id INT PRIMARY KEY AUTO_INCREMENT,
  t_name VARCHAR(20)
);

CREATE TABLE IF NOT EXISTS class(
  c_id INT PRIMARY KEY AUTO_INCREMENT,
  c_name VARCHAR(20),
  teacher_id INT
);
#建立一对一外键关系,这个需要学习了解
ALTER TABLE class ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(t_id);

#插入teacher数据
INSERT INTO teacher(t_name) VALUES('Mandy');
INSERT INTO teacher(t_name) VALUES('Chris');

#插入class数据
INSERT INTO class(c_name, teacher_id) VALUES('class_a', 1);
INSERT INTO class(c_name, teacher_id) VALUES('class_b', 2);


SELECT * FROM teacher;
SELECT * FROM class;
#级联查询表
select * from class c, teacher t where c.teacher_id=t.t_id and c.c_id=1;

java项目中maven配置:(pom.xml)

 
    
    
      log4j
      log4j
      1.2.16
    
    
    
      mysql
      mysql-connector-java
      5.1.33
    
    
    
      org.mybatis
      mybatis
      ${mybatis.version}
    
    
      junit
      junit
      4.11
      test
    
  
  
  
    mybatis
    
      
        org.mybatis.generator
        mybatis-generator-maven-plugin
        1.3.2
        
          true
          true
        
      
    
    
      
        src/main/java
        
          **/*.properties
          **/*.xml
        
        
        false
      
      
        src/main/resources
        
      
    
  

mybatis配置文档:




    
    
    
        
        
    
    
        
            
            
            
                
                
                
                
            
        
    

        
    
        
    

两个domain类:

public class Classes {
    private int id;//id===>c_id
    private String name;//name===>c_name
    private Teacher teacher;

    public Classes(int id, String name, Teacher teacher) {
        this.id = id;
        this.name = name;
        this.teacher = teacher;
    }

    public Classes() {
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }

    @Override
    public String toString() {
        return "Classes {id="+id+" ,name="+name+" , teacher="+teacher+"}";
    }
}

public class Teacher {

    private int id; // id --> t_id
    private String name; // name --> t_name

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Teacher {id="+ id+" ,name="+ name +"}";
    }
}

ClassMapper.xml



    
    
        
        
        
        
            
            
        
    
    

运行代码时候:

public class App 
{
    public static void main( String[] args )
    {
       SqlSession session = MyBatisUtil.getSqlSession();
       String strId = "com.mybatis.oneToone.mapping.ClassMapper.getClass1";
       Classes clazz = session.selectOne(strId,1);
        System.out.println(clazz);
    }
}

显示如下错误:
Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException:

Error querying database. Cause: org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.mybatis.oneToone.domain.Teacher

Cause: org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.mybatis.oneToone.domain.Teacher

at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:95)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:59)
at com.mybatis.oneToone.App.main(App.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

Caused by: org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.mybatis.oneToone.domain.Teacher

at org.apache.ibatis.builder.MapperBuilderAssistant.setStatementResultMap(MapperBuilderAssistant.java:354)
at org.apache.ibatis.builder.MapperBuilderAssistant.addMappedStatement(MapperBuilderAssistant.java:292)
at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:113)
at org.apache.ibatis.session.Configuration.buildAllStatements(Configuration.java:579)
at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:505)
at org.apache.ibatis.session.Configuration.getMappedStatement(Configuration.java:500)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:100)
... 8 more

Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for com.mybatis.oneToone.domain.Teacher

at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:672)
at org.apache.ibatis.session.Configuration.getResultMap(Configuration.java:434)
at org.apache.ibatis.builder.MapperBuilderAssistant.setStatementResultMap(MapperBuilderAssistant.java:352)
... 14 more

希望好心人帮忙一下,我已经尽力排查我自己能够知道的错误,但是真的不米昂白为何还是报错。

阿神
阿神

闭关修行中......

全部回复(3)
迷茫

这个问题,我已经找到方法了,首先mybatis我现在用的版本是有一对一映射,使用association标签。这里需要这样修改:

    <select id="getClass1" parameterType="int" resultMap="classResultMap">
        select *
        from class c LEFT JOIN teacher t
        ON C.teacher_id = T.t_id
        where c.c_id=#{id}
    </select>
    <!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->
    <resultMap id="classResultMap" type="Classes">
        <id property="id" column="c_id" />
        <result property="name" column="c_name" />
        <!-- 一对一映射 使用的标签 -->
        <association property="teacher" column="teacher_id"  javaType="com.mybatis.oneToone.domain.Teacher">
            <id property="id" column="t_id" />
            <result property="name" column="t_name" />
        </association>
    </resultMap>

    <select id="getClass2" parameterType="int" resultMap="classResultMap2" >
        SELECT * FROM  class WHERE c_id=#{id}
    </select>
    <!-- 使用resultMap映射实体类和字段之间的一一对应关系 -->
    <resultMap id="classResultMap2" type="Classes">
        <id property="id" column="c_id" />
        <result property="name" column="c_name" />
        <association property="teacher" column="teacher_id" select="getTeacher" />
    </resultMap>

    <select id="getTeacher" parameterType="int" resultType="Teacher">
        SELECT t_id id,t_name name FROM teacher WHERE t_id=#{id}
    </select>
怪我咯

没用过mybatis

不过可以这样:

遇到这种情况直接看最后一个caused by:

Caused by: java.lang.IllegalArgumentException: Result Maps collection does not contain value for com.mybatis.oneToone.domain.Teacher

说结果集中集合不包括Teacher成员,我记得mybatis是弱封装,是不支持单纯的1对1的,即时是1对1也是要用collection去接受,然后取第一个

也有可能是我太老了,呵呵

PHPz

xml 有一部分有问题:

        <association property="teacher" column="teacher_id" javaType="Teacher">
            <id property="t_id" column="t_id" />
            <result property="t_name" column="t_name" />
        </association>

修改为:

        <association property="teacher" column="teacher_id" javaType="Teacher">
            <id property="id" column="t_id" />
            <result property="name" column="t_name" />
        </association>

前面的 property 指的是 Teacher 中的属性名,后面的 column 指的是查询的数据库字段名。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号