mybatis标签实现Map<String, List<String>>的查询

实体类

@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>

解释

  1. getStudentIdsByTeacherId - 这个查询返回的是一个简单的Map<String, List<String>>,其中键是讲师ID,值是讲师对应的未分配的学生ID列表。
  2. getCourseWithUnassignedStudents - 这个查询返回的是 Course 实体类,其中包含了一个 Map<String, List<String>> studentIds。这里的 <association> <collection> 是嵌套使用的,以便能够正确地映射讲师和学生之间的关系。
    注意
  3. <collection> 中,ofType 属性指定了集合中元素的类型,columnPrefix 用于指定列名前缀。
    <association>用于映射讲师信息,这里我们只映射了 teacherId,因为 Course 实体类中不需要完整的讲师信息。
    <collection>用于映射学生信息,同样只映射了 studentId。
    这种方法可以用于处理复杂的集合映射,但需要注意的是,如果需要完整的讲师和学生信息,可能需要更复杂的嵌套查询或者使用子查询来获取这些信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值