Mybatis一对多,多对一中主子表字段名一致产生的问题及解决方案

数据库两张表的字段名都和两个类的属性名称一样,这时在关联查询出现一个问题。

学生类:

package com.pojo;  

public class Student {  

    private int id;
    private String name;
    private int age;
    private ClassInfo classInfo;  

    public Student() {  

    }  

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }  

    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 int getAge() {
        return age;
    }  

    public void setAge(int age) {
        this.age = age;
    }  

    public void setClassInfo(ClassInfo classInfo) {
        this.classInfo = classInfo;
    }  

    public ClassInfo getClassInfo() {
        return classInfo;
    }  

}  
package com.pojo;  

import java.util.Set;  

public class ClassInfo {  

    private int id;
    private String name;
    private Set<Student> stus;  

    public ClassInfo() {  

    }  

    public ClassInfo(String name) {
        super();
        this.name = 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;
    }  

    public void setStus(Set<Student> stus) {
        this.stus = stus;
    }  

    public Set<Student> getStus() {
        return stus;
    }  

}  
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dao">  

  <!-- 继承式多对一 -->
  <resultMap type="Student" id="student">
    <id property="id" column="id" />
    <result property="name" column="name" />
    <result property="age" column="age" />
  </resultMap>
  <resultMap type="Student" id="StudentResultMap" extends="student">
    <association property="classInfo" column="classInfo_id" javaType="ClassInfo">
      <id property="id" column="id" />
      <result property="name" column="name" />
    </association>
  </resultMap>  

  <select id="manyToOne" resultMap="StudentResultMap">
    select s.*,c.* from student s left join classInfo c on s.classInfo_id = c.id
  </select>  

</mapper>  
@Test
public void manyToOne(){
    SqlSession session = factory.openSession();
    List<Student> stuList = session.selectList("com.dao.manyToOne");
    for (Student stu : stuList) {
        System.out.println(stu.getId()+":"+stu.getName()+","+stu.getAge());
        System.out.println(stu.getClassInfo().getId()+":"+stu.getClassInfo().getName());
    }
    session.close();
}  

输出结果:

2013-11-18 03:52:30,500 [main] DEBUG [com.dao.manyToOne] - ooo Using Connection [com.MySQL[email protected]]
2013-11-18 03:52:30,500 [main] DEBUG [com.dao.manyToOne] - ==>  Preparing: select s.*,c.* from student s left join classInfo c on s.classInfo_id = c.cid 
2013-11-18 03:52:30,593 [main] DEBUG [com.dao.manyToOne] - ==> Parameters: 
2013-11-18 03:52:30,656 [main] DEBUG [com.dao.manyToOne] - <==      Total: 1
5:Wang,20
5:Wang

这里输出班级的编号和名称也编程了学生的编号和名称,由于学生表(Student)和班级表(ClassInfo)都有id和name字段,导致查询结果也一样,

如果是一对多映射查询出来都是班级的编号和名称。由于字段名相同,取到s.*(id和name)后面的c.*就不回取了,所以学生取完id和name没错,

班级也会取学生的字段,所以结果都是一样的。如果反过来换成Preparing: select c.*,s.*from student s left join classInfo c on s.classInfo_id = c.cid ,

结果会都为班级的信息。

解决方法:

查询给列取别名

select c.*,s.id sid,s.name sname,s.age from student s left join classInfo c on s.classInfo_id = c.id

映射的column也要对应查询时的别名:

<resultMap type="Student" id="student">
  <id property="id" column="sid" />
  <result property="name" column="sname" />
  <result property="age" column="age" />
</resultMap>  

此外还有一种方法就是将主子表的id值名称设置为不一样,虽然这种方式可以解决此问题,但是解决了问题却不知问题之所以然。所以建议还是使用以上方法。

  本文参考转载自 http://blog.csdn.net/lee4037/article/details/16798941 感谢作者分享

时间: 2024-07-29 16:51:20

Mybatis一对多,多对一中主子表字段名一致产生的问题及解决方案的相关文章

【工作杂记】一次修改表字段名操作导致的报表缺失了2个小时的数据

因为MSTR中设计实体的时候,字段名不一样的话两个表无法关联(很死板),故修改了表TBL_FACT_SKILL_RG96868_HOUR中的被叫字段名called_no->calleeno,大概9点20左右的时候做的修改列名操作. 由于疏忽,忘记修改了前一日新增的存储过程中的PRC_SKILL_RG_96868_HOUR的insert操作列名还未修改,导致存储过程编译失败,由于该过程又被更高一级每半小时执行一次的过程sp_icd_h_job调用了,进一步导致此过程也编译失败,但是当时并没有做验证

mybatis使用中类属性名和数据库表字段名问题

起初我以为上述二者必须一致,后来发现也是可以像Hibernate那样在xml文件中进行映射的. <mapper namespace="com.tenghu.mybatis.model.xml.DepartmentMapper"> <!-- 配置映射字段 --> <resultMap type="Department" id="tab_department"> <id property="ids&

MyBatis两张表字段名相同产生的问题

结论: 通过设置别名的方式让其产生区别 <select id="queryBySekillId" resultMap="successKilled"> select sk.seckill_id "seckill_id", sk.user_phone "user_phone", sk.state "state", sk.create_time "create_time", s.

MyBatis 一对多,多对一关联查询的时候Mapper的顺序

要先写association,然后写collection:这是由DTD决定的: <resultMap ...> <association ...> </association> <collection ...> </collection > </resultMap>

oracle修改表字段名时报错:ORA-00054:资源正忙,但指定以NOWAIT方式获取资源,或者超时失效的问题

打开sql plus select session_id from v$locked_object;查询出oracle锁定的会话ID SELECT sid, serial#, username, osuser FROM v$session where sid = 1; 查询出当前会话数的信息 ALTER SYSTEM KILL SESSION '200,2141'; 杀掉当前会话 注:'200,2141'是:SID和SERIAL字段进行拼接的

sql获取表字段名、描述和类型

SELECT TableName = OBJECT_NAME(c.object_id), ColumnsName = c.name, Description = ex.value, ColumnType=st.name, Length=c.max_length FROM sys.columns c LEFT JOIN sys.extended_properties ex ON ex.major_id = c.object_id AND ex.minor_id = c.column_id AND

mysql中修改表字段名/字段长度/字段类型详解

先来看看常用的方法 MySql的简单语法,常用,却不容易记住.当然,这些Sql语法在各数据库中基本通用.下面列出: 1.增加一个字段 alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL; //增加一个字段,默认为空alter table user add COLUMN new2 VARCHAR(20) NOT NULL; //增加一个字段,默认不能为空 2.删除一个字段 alter table user DROP COLUMN ne

MyBatis——一对多、多对一

遇见你之前心猿意马.可遇见你之后,猿跳走了,马飞奔而去,只剩心意,全然为你. 1.多对一处理 多对一: 多个学生,对应一个老师 对于学生这边而言,关联,多个学生,关联一个老师[多对一] 对于老师而言,集合,一个老师有很多学生[一对多] SQL: CREATE TABLE `teacher`( `id` int(10) Not null, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`) )ENGINE=INNODB DEFAULT CHARS

MyBatis一对多和多对多xml配置

MyBatis一对多和多对多xml配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ktcx.