入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

mybatis的collection一对多嵌套查询

创建时间:2018-05-29 投稿人: 浏览次数:184

刚才在csdn上提了一个问题

三张表:

create table stu(
  sno int auto_increment primary key ,
  sname varchar(10)
);
create table class (
  cid   int auto_increment primary key,
  cname varchar(10)
); 
create table cs (
  cid int,
  sno int,
  foreign key(cid) references class(cid),
  foreign key(sno) references stu(sno)

);

数据:

insert into stu values (0,"stu1");
insert into stu values (0,"stu2");
insert into stu values (0,"stu3");
insert into stu values (0,"stu4");
insert into stu values (0,"stu5");

insert into class values (0,"class1");
insert into class values (0,"class2");

insert into cs values (1,1);
insert into cs values (1,2);
insert into cs values (2,3);
insert into cs values (2,4);
insert into cs values (2,5);

每个班级有多个学生

mapper.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.iails.site.dao.ClazzMapper">

    <!-- 第一种方式 -->
    <resultMap id="getList2ResultMap" type="com.iails.site.entity.Clazz">
        <id property="classId" column="cid"/>
        <result property="className" column="cname"/>
        <collection property="students" column="cid" ofType="com.iails.site.entity.Student"
        select="getList2Student">
            <id property="studentId" column="sno"/>
            <result property="studentName" column="sname"/>
        </collection>
    </resultMap>

    <select id="getList2Student" resultType="com.iails.site.entity.Student">
        select *
        from stu,cs
        where stu.sno=cs.sno and #{cid}=cs.cid
    </select>
    <select id="getList2" resultMap="getList2ResultMap">
        select *
        from class
    </select>


    <!-- 第二种方式 -->
    <resultMap id="getListResultMap" type="com.iails.site.entity.Clazz">
        <id property="classId" column="cid"/>
        <result property="className" column="cname"/>
        <collection property="students" column="cid" ofType="com.iails.site.entity.Student">
            <id property="studentId" column="sno"/>
            <result property="studentName" column="sname"/>
        </collection>
    </resultMap>

    <select id="getList" resultMap="getListResultMap">
        select *
        from stu, class, cs
        where class.cid=cs.cid and stu.sno=cs.sno
    </select>
</mapper>

问题是:第二种方式没问题,第一种方法查询出来Class对象的Students列表有值,数目也符合,但是值为null

[{"classId":1,"className":"class1","students":[null, null]}, {"classId":2,"className":"class2","students":[null, null, null]}]

并且如果Student的属性名和stu的字段名完全一致或者把ofType和getList2Student的resultType改为”map”又可以映射成功。

最后

发现提问下有一个链接https://blog.csdn.net/minpann/article/details/51217106,按照他的方法
把第一种方法改为这样就行了。。

    <!-- 第三种方式 -->
    <resultMap id="getList3ResultMap" type="com.iails.site.entity.Clazz">
        <id property="classId" column="cid"/>
        <result property="className" column="cname"/>
        <collection property="students" column="cid" ofType="com.iails.site.entity.Student"
                    select="getList3Student">

        </collection>
    </resultMap>

    <resultMap id="getList3StudentResultMap" type="com.iails.site.entity.Student">
        <id property="studentId" column="sno"/>
        <result property="studentName" column="sname"/>
    </resultMap>

    <select id="getList3Student" resultMap="getList3StudentResultMap">
        select *
        from stu,cs
        where stu.sno=cs.sno and #{cid}=cs.cid
    </select>
    <select id="getList3" resultMap="getList3ResultMap">
        select *
        from class
    </select>
  • 也就是说:嵌套查询时,在collection内部的property和colum不一致时需要为这个映射关系另外定义resultmap

坑。。我的积分啊

阅读更多
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像