SpringBoot+Hibernate+Mysql的联表查询
上一篇对SpringBoot+Hibernate+Mysql的基本部署和常用增删查改进行了说明,下面主要阐述下SpingBoot中关于hibernate的多表连接查询。
1.首先建立数据库表及其字段时应考虑外健的关联性
表一:student
表二:classroom
classroom的实体类没有变化依旧如下:
package com.example.springboothibernate.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* springboot集成hibernate 实例
* @Entity用来标识这是一个实体类
* @Id hibernate的特征,必须要一个id不然会报错
* @Column(name = "sid") 用来跟表的字段做个映射,如果名字相同就不需要写
* @return
*/
@Entity
@Table(name="classroom")
public class ClassRoom {
@Id
@Column(name = "classId")
private String classId;
@Column(name = "className")
private String className;
@Column(name = "subject")
private String subject;
public String getClassId() {
return classId;
}
public void setClassId(String classId) {
this.classId = classId;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
}
注意
student 对应的实体类Student 需加入ClassRoom的参数
因为classroom 和student是一对多的关系,所以在student角度来看是多对一即ManyToOne
student的实体类如下:
package com.example.springboothibernate.entity;
import javax.persistence.*;
/**
* springboot集成hibernate 实例
* @Entity用来标识这是一个实体类
* @Id hibernate的特征,必须要一个id不然会报错
* @Column(name = "sid") 用来跟表的字段做个映射,如果名字相同就不需要写
* @return
*/
@Entity
@Table(name="student")
public class Student {
@Id
@Column(name = "sId")
//@GeneratedValue(strategy= GenerationType.AUTO) 设置主键自增
private int sId;
@Column(name = "sName")
private String sName;
@Column(name = "classId")
private String classId;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "classId",insertable=false,updatable=false)
//多表连接查询时一张表里面不能有两个相同字段:处理方法
// 1.修改表字段 2.添加insertable=false,updatable=false
private ClassRoom classRoom;
public int getsId() {
return sId;
}
public void setsId(int sId) {
this.sId = sId;
}
public String getsName() {
return sName;
}
public void setsName(String sName) {
this.sName = sName;
}
public String getClassId() {
return classId;
}
public void setClassId(String classId) {
this.classId = classId;
}
public ClassRoom getClassRoom() {
return classRoom;
}
public void setClassRoom(ClassRoom classRoom) {
this.classRoom = classRoom;
}
}
调用查询接口可以看到如下结果:
[
{
"sId": 1,
"sName": "麦迪",
"classId": "1",
"classRoom": {
"classId": "1",
"className": "一年级",
"subject": "体育"
}
},
{
"sId": 0,
"sName": "利拉德",
"classId": "2",
"classRoom": {
"classId": "2",
"className": "二年级",
"subject": "数学"
}
},
{
"sId": 3,
"sName": "戴维斯",
"classId": "3",
"classRoom": {
"classId": "3",
"className": "三年级",
"subject": "心理学"
}
},
{
"sId": 8,
"sName": "詹姆斯",
"classId": "4",
"classRoom": {
"classId": "4",
"className": "四年级",
"subject": "计算机科学与技术"
}
}
]
你的每一个点赞,我都认真当成了喜欢。