mybatis collection的嵌套查询问题
三张表:
数据:
每个班级有多个学生
mapper.xml
问题是:第二种方式没问题,第一种方法查询出来Class对象的Students列表有值,数目也符合,但是值为null
并且如果Student的属性名和stu的字段名完全一致或者把ofType和getList2Student的resultType改为"map"又可以映射成功。
是需要配置什么吗?
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"又可以映射成功。
是需要配置什么吗?
...全文
相关推荐
Mybatis系列课程-一对一
**嵌套查询的执行策略**: - **Eager loading(急加载)**:默认情况下,Mybatis会立即加载所有关联的数据,这可能会导致性能问题,但如果关联数据经常被用到,这可能是最佳选择。
PageHelper插件实现一对多查询时的分页问题
例如,在查询活动列表时,需要同时查询活动对应的模板列表,但是PageHelper插件不能正确地处理这种嵌套查询。解决这个问题有两种方式:1. 在代码中处理。
Mybatis实现一对一和一对多关联查询
MyBatis使用resultMap中的collection元素实现该映射,同样支持嵌套查询与嵌套结果两种策略。
mybatis项目1对多,多对多练习含sql,非常详细
实践中遇到的问题和解决策略将深化你对MyBatis框架的理解,提升你在数据访问层的设计和实现能力。
mybatis之一对多
总结起来,MyBatis 的 `<association>` 和 `<collection>` 标签是处理一对多关联关系的核心工具,通过合理的配置,我们可以优雅地解决复杂的数据映射问题,同时保持代码的简洁性和高效性


Web 开发
