前段時間在工作中遇到需要一對多關聯查詢的情況,百度了好久遇到各種坑,所以在此記錄一下,話不多說直接開始
首先,先建幾個測試類,主子表通過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
}
]
}