实体类
@Data
public class Course {
private String courseId;
private Map<String, List<String>> studentIds;
}
@Data
public class Teacher {
private String teacherId;
private String name;
}
@Data
public class Student {
private String studentId;
private String name;
}
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.example.mapper.CourseMapper">
<!-- 查询讲师,和老师教的学生 -->
<select id="getStudentIdsByTeacherId" resultType="java.util.Map">
SELECT cts.teacher_id, s.student_id
FROM course_teacher_student cts
JOIN student s ON cts.student_id = s.student_id
WHERE cts.status = 0
GROUP BY cts.teacher_id
</select>
<!-- 查询课程,讲师,及听讲师讲课的学生 -->
<select id="getCourseWithUnassignedStudents" resultType="com.example.model.Course">
SELECT c.course_id,
<collection property="studentIds" ofType="java.util.List" columnPrefix="student_id_">
<association property="teacherId" javaType="java.lang.String" column="teacher_id">
<id column="teacher_id" property="teacherId"/>
</association>
<collection property="studentIds" ofType="java.lang.String" columnPrefix="student_id_">
<id column="student_id" property="studentId"/>
</collection>
</collection>
FROM course c
LEFT JOIN (
SELECT cts.course_id, cts.teacher_id, s.student_id
FROM course_teacher_student cts
JOIN student s ON cts.student_id = s.student_id
WHERE cts.status = 0
) AS unassigned_students ON c.course_id = unassigned_students.course_id
GROUP BY c.course_id
</select>
</mapper>
解释
- getStudentIdsByTeacherId - 这个查询返回的是一个简单的
Map<String, List<String>>
,其中键是讲师ID,值是讲师对应的未分配的学生ID列表。 - getCourseWithUnassignedStudents - 这个查询返回的是 Course 实体类,其中包含了一个
Map<String, List<String>>
studentIds。这里的<association>
和<collection>
是嵌套使用的,以便能够正确地映射讲师和学生之间的关系。
注意 - 在
<collection>
中,ofType 属性指定了集合中元素的类型,columnPrefix 用于指定列名前缀。
<association>
用于映射讲师信息,这里我们只映射了 teacherId,因为 Course 实体类中不需要完整的讲师信息。
<collection>
用于映射学生信息,同样只映射了 studentId。
这种方法可以用于处理复杂的集合映射,但需要注意的是,如果需要完整的讲师和学生信息,可能需要更复杂的嵌套查询或者使用子查询来获取这些信息。