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。
    这种方法可以用于处理复杂的集合映射,但需要注意的是,如果需要完整的讲师和学生信息,可能需要更复杂的嵌套查询或者使用子查询来获取这些信息。
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mybatis返回List<Map<String, Object>>的好处在于不需要再定义一个实体类对象,可以直接接收返回的数据。这种返回类型通常用于连接查询,当查询结果涉及多个表时,可以使用这种方式来接收返回的数据。\[2\]在xml文件中,可以使用resultType="java.util.HashMap"来定义返回类型为List<Map<String, Object>>。\[1\]这样,查询结果会以List的形式返回,每个元素都是一个Map,其中Key为String类型,Value为Object类型。这样的返回结果可以方便地进行遍历和操作。\[3\] #### 引用[.reference_title] - *1* [mybatis 查询返回ListStringMapString,ObjectListMapString,Object](https://blog.csdn.net/li1325169021/article/details/114003291)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v12^insert_chatgpt"}} ] [.reference_item] - *2* [Mybatis查询返回MapString,Object类型](https://blog.csdn.net/Syals/article/details/125333637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v12^insert_chatgpt"}} ] [.reference_item] - *3* [mybatis返回结果为ListMapString, Object的写法](https://blog.csdn.net/weixin_43860634/article/details/124401119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v12^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值