mybatis主子表嵌套查詢,返回一個對象帶有集合屬性

前段時間在工作中遇到需要一對多關聯查詢的情況,百度了好久遇到各種坑,所以在此記錄一下,話不多說直接開始

首先,先建幾個測試類,主子表通過grade_id關聯,具體屬性註釋我就省略不寫了,大家能看懂

  • 主表
	@Data
	@TableName("grade")
	public class Grade implements Serializable {
	    private Long id;
	    private String name;
	    private String address;
		}
  • 子表1
    @Data
    @TableName("teacher")
    public class Teacher implements Serializable {
        private Long id;
        private String name;
        private Integer age;
        private String categroy;
        private Integer level;
        private Long gradeId;		// 關聯主表id
    	}
    
  • 子表2
    @Data
    @TableName("student")
    public class Student implements Serializable {
        private Long id;
        private String name;
        private Integer age;
        private String address;
        private Long gradeId;		// 關聯主表id
    }
    
  • 表結構和實體類一樣我就不放了,沒啥特別的

其次,創建一個DTO用來接收查詢出來的結果,這個大家都懂,不解釋

@Data
public class GradeDTO implements Serializable {
    private Long id;
    private String name;
    private String address;
    private List<Teacher> teacherList;
    private List<Student> studentList;
}

重點,配置mapper.xml文件

  • 首先需要配置resultMap用來接收返回結果,這個大家百度得到,關聯集合就是用collection,如下
        <resultMap type="com.kasi.mybatis_plus.model.GradeDTO" id="gradeMap">
        <id column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="address" property="address"/>
        <collection property="teacherList" ofType="com.kasi.mybatis_plus.model.Teacher" >
            <id column="t_id" property="id"/>
            <result column="t_name" property="name"/>
            <result column="t_age" property="age"/>
            <result column="t_categroy" property="categroy"/>
            <result column="t_level" property="level"/>
        </collection>
        <collection property="studentList" ofType="com.kasi.mybatis_plus.model.Student">
            <id column="s_id" property="id"/>
            <result column="s_name" property="name"/>
            <result column="s_age" property="age"/>
            <result column="s_address" property="address"/>
        </collection>
    </resultMap>
    
    常用的屬性就不說了,特別要注意的是ofType這個要指向各自表的實體類,然後子表的column屬性不要和主表重名,一旦重名就會出問題,不知道是不是我配置的問題,希望有大佬指教,反正不重名就可以
  • 接下來就是查詢語句了,很簡單,只要別名和上面resultMap對的上就ok
        <select id="get" resultMap="gradeMap">
        SELECT
            a.id,
            a.name,
            a.address,
            b.id as t_id,
            b.name as t_name,
            b.age as t_age,
            b.categroy as t_categroy,
            b.level as t_level,
            c.id as s_id,
            c.name as s_name,
            c.age as s_age,
            c.address as s_address
        FROM grade a
        LEFT JOIN teacher b ON a.id=b.grade_id
        LEFT JOIN student c ON a.id=c.grade_id
        WHERE a.id=#{id}
    </select>
    

    最後,看看查詢結果,其實很簡單的,網上教程也很多,但是別名那個地方很多人都沒有強調導致犯了很多錯

    ps:查詢集合也是一樣的,不說了
    • 數據表查詢
      在這裏插入圖片描述
    • 實際查詢結果
      {
      "id": 1,
      "name": "3年1班",
      "address": "三樓",
      "teacherList": [
          {
              "id": 1,
              "name": "宋元橋",
              "age": 50,
              "categroy": "武當",
              "level": 1,
              "gradeId": null
          },
          {
              "id": 2,
              "name": "俞蓮舟",
              "age": 43,
              "categroy": "武當",
              "level": 2,
              "gradeId": null
          }
      ],
      "studentList": [
          {
              "id": 1,
              "name": "金毛獅王",
              "age": 47,
              "address": "冰火島",
              "gradeId": null
          },
          {
              "id": 2,
              "name": "紫衫龍王",
              "age": 39,
              "address": "靈蛇島",
              "gradeId": null
          }
      ]
      
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章