ibatis 多表关联 字段名重复,然后映射到类的时候后面的字段跟前面的一样了,sql查询返回值当然是不一样的 
比如:一个教师表里对应2个class字段 
<resultMap id="tch" resultClass="tch"> 
    <result property="id" column="id" /> 
    <result property="name" column="name" /> 
    <result property="c1" column="class1"/> 
    <result property="c2" column="class2"/> 
    <result property="class1" resultMap="Class.class" /> 
    <result property="class2" resultMap="Class.class" /> 
</resultMap> 
<resultMap id="class" resultClass="class"> 
    <result property="id" column="id" /> 
    <result property="name" column="name" /> 
    <result property="desc" column="desc" /> 
    <result property="level" column="level" /> 
</resultMap> 
sql:select tch.*,class1.*,class2.* from tch left join class1 on tch.c1=class1.id 
left join class2 on tch.c1=class2.id 
映射后class2中的值不对,请高手说明 

解决方案 »

  1.   


    1、resultMap里的配置<result/>的时候那里面的column并不是指你的数据库表的字段名而是你的SQL里查询的时候使用的名字,那么你可以给每个字段起别名啊。2、既然你的tch类里有超过一个的class类型的对象,为什么不用List呢?写SQL居然用SELECT * ,汗一个。领导看到你这么写SQL不骂你吗?
      

  2.   

    ibtaits没那么智能,它也是按照column的值去resultset.getXxx(String columnName)吧,映射后class2的值应该是与class1一样的吧,二张表就对应二个映射再用别名,我只想到了这种方式
      

  3.   

    请问别名怎么设置吗?
    select class1.id as id...?如果是这种方式的话class2中的别名怎么设置
    select class1.id as class1.id...?如果是这种方式的话报错设不进去的
      

  4.   

    class1:
    <result property="id" column="id_one" />  
    class2:
    <result property="id" column="id_two" /> sql:
    select class1.id as id_one,class2.id as id_two咯很明显,如果两表有同名字段,是不能select class1.*,class2.*滴
      

  5.   


    比如class1中有id字段,class2中也有id字段你可以起不同的别名啊比如:
    <select id="querySingleRoleByRoleDTO" parameterType="roleDTO" resultMap="roleDTOMap">
    SELECT
    r.FID AS rid,
    r.FNAME AS rname,
    n.FID AS nid,
    n.FNAME AS nname,
    n.FLINK AS nlink,
    n.FTYPE_CODE AS ntypeCode,
    n.FPARENT_ID AS nparentId,
    n.FLEVEL AS nlevel
    FROM 
    T_SYS_ROLE r LEFT OUTER JOIN T_SYS_ROLE_FUNC_REL rel on r.FID = rel.FROLE_ID
    LEFT OUTER JOIN T_SYS_FUNC_NODE n on rel.FNODE_ID = n.FID
    <where>
    <if test="id > 0 ">
    r.FID = #{id}
    </if>
    <if test="name != null &amp;&amp; name != '' ">
    AND r.FNAME = #{name}
    </if>
    </where>
    </select> <resultMap type="roleDTO" id="roleDTOMap">
    <id property="id" column="rid"/>
    <result property="name" column="rname"/>
    <collection property="nodes" ofType="nodeDTO" resultMap="nodesDTOMap"/>
    </resultMap>

    <resultMap type="nodeDTO" id="nodesDTOMap">
    <id property="id" column="nid"/>
    <result property="name" column="nname"/>
    <result property="link" column="nlink"/>
    <result property="typeCode" column="ntypeCode"/>
    <result property="parentId" column="nparentId"/>
    <result property="level" column="nlevel"/>
    <result property="needUserInfo" column="nneedUserInfo"/>
    </resultMap>
    注意, SELECT语句里,AS后面的别名是唯一的就OK了。