需求:返回一个班级的基本信息和班主任信息和这个班级的所有的学生信息。
即一个班级对象里面有自身的班级信息,一个班主任的Object信息和一个学生对象的List信息。
创建了三个表
1.班级表t_class
2.学生表t_student
3.班主任表t_teacher
查询的sql是这样的
我们可以知道,老师和班级是一个对象,三条数据中的老师和班级信息都是一样的,只有学生的信息不同。
在xml代码中的体现如下,property是java实体类的属性名称,column是sql返回的字段名称。
注意:如果property和column的参数一样的话,此result标签可以不写,仅限result标签,id标签不能省略。
<resultMap id="classDetail" type="com.salong.myself.entity.TClass">
<id property="id" column="id"></id>
<result property="name" column="name"></result>
<result property="detail" column="detail"></result>
<association property="teacher" javaType="com.salong.myself.entity.TTeacher">
<id property="id" column="id"></id>
<result property="name" column="teacherName"></result>
<result property="age" column="teacherAge"></result>
</association>
<collection property="students" ofType="com.salong.myself.entity.TStudent" javaType="java.util.List">
<id property="id" column="stuId"></id>
<result property="name" column="stuName"></result>
<result property="age" column="age"></result>
</collection>
</resultMap>
<select id="getClassDetail" resultMap="classDetail">
SELECT
c.*,
s.id as stuId,
s.name as stuName,
s.age,
tt.`Name` as teacherName,
tt.age as teacherAge
FROM
t_class c
LEFT JOIN t_student s ON c.id = s.class_id
LEFT JOIN t_teacher tt on tt.class_id=c.id
where c.id=#{classId}
</select>
其中,association 标签必须在collection之前(如果两个都有的话),不然会报错,而且javaType必须指定。
最后给大家看看我的三个实体类。
@Data
@Accessors(chain = true)
public class TClass {
@TableId("id")
private Long id;
private String name;
private String detail;
@TableField(exist = false)
private List<TStudent> students;
@TableField(exist = false)
private TTeacher teacher;
}
@Data
@Accessors(chain = true)
public class TStudent {
@TableId("id")
private Long id;
private Integer classId;
private String name;
private Integer age;
}
@Data
@Accessors(chain = true)
@ApiModel(value="TTeacher对象", description="")
public class TTeacher{
@TableId("id")
private Long id;
private Integer classId;
private String name;
private Integer age;
}