Jpa多表关联查询

准备

一对多关系

需求:通过ID,查询学生信息,然后通过学生查询对应的成绩信息
--实体类
@Entity
@Table(name="tb_student")
public class Student implements Serializable {
   private static final long serialVersionUID = 1L;

   @Id
   @GeneratedValue(strategy=GenerationType.IDENTITY)
   @Column(name="student_id")
   private int studentId;

   @Column(name="student_name")
   private String studentName;

   @Column(name="student_pwd")
   private String studentPwd;

   //建立学生与成绩的关系,一个学生可以有多门成绩,一门成绩只能属于一个学生,一对多的关系。
   //一个学生可以有多成绩,所以我们需要使用集合来储存成绩
   @OneToMany
   //不管是什么关系,必须要指定关联关系的外键
   @JoinColumn(name = "student_id")
   private List<Result> results;
  //补全get/set方法
}

–测试代码

//需求:通过ID,查询学生信息,然后通过学生查询对应的成绩信息
@Test
public void findById(){
    //第一步:获得操作对象
    EntityManager entityManager = JpaUtils.getEntityManager();
    //第二步:操作-查询
    //查询学习信息
    Student student = entityManager.find(Student.class, 1);
    System.out.println("学生名:"+student.getStudentName());
    //通过学生的信息找到成绩信息
    List<Result> results = student.getResults();
    for (Result result : results) {
        System.out.println("科目:"+result.getResultSubject()+",成绩:"+result.getResultScore());
    }
    //第三步:提交关闭
    entityManager.close();
}

多对一关系

需求:通过ID,查询成绩信息,然后通过成绩查询对应的学生信息

–实体类

@Entity
@Table(name="tb_result")
public class Result implements Serializable {
   private static final long serialVersionUID = 1L;

   @Id
   @GeneratedValue(strategy=GenerationType.IDENTITY)
   @Column(name="result_id")
   private int resultId;

   @Column(name="result_score")
   private float resultScore;

   @Column(name="result_subject")
   private String resultSubject;
   //成绩与学生是多对一的关系。意味着一条成绩只能对应一个学生。
   @ManyToOne
   @JoinColumn(name = "student_id")
   private Student student;
//补全get、set方法
}

–测试代码

//需求:通过ID,查询成绩信息,然后通过成绩查询对应的学生信息
@Test
public void findById(){
    //第一步:获得操作对象
    EntityManager entityManager = JpaUtils.getEntityManager();

    //第二步:操作-查询
    //查询学习信息
    Result result = entityManager.find(Result.class, 1);
    System.out.println("科目:"+result.getResultSubject()+",分数:"+result.getResultScore());
    //通过成绩查询学生
    System.out.println("学生名:"+result.getStudent().getStudentName());
    //第三步:提交关闭
    entityManager.close();
}

一对一关系

需求:通过ID查询学生身份信息,在通过学生身份查询学生信息
--学生身份实体类
@Entity
@Table(name="tb_student_identifer")
public class StudentIdentifer implements Serializable {
   private static final long serialVersionUID = 1L;

   @Id
   @Column(name="student_id")
   private int studentId;

   @Column(name="student_idcard")
   private String studentIdcard;

   @Column(name="student_number")
   private String studentNumber;

   //配置学生身份与学生的而关系,一对一
   @OneToOne
   @JoinColumn(name = "student_id")
   private  Student student;
   //补全Get、Set代码
}

–测试代码

@Test
public void findStudentIdentiferAndStudent(){
    //查询身份
    EntityManager manager = JpaUtils.getEntityManager();
    StudentIdentifer identifer = manager.find(StudentIdentifer.class, 1);
    System.out.println("身份证:"+identifer.getStudentIdcard()+",学生名:"+identifer.getStudent().getStudentName());

}

多对多关系

需求:通过ID,查询学生信息,然后通过学生查询对应教师信息
--Student实体类,增加以下代码
//多对多的三个条件,中间表示谁,本表外键示谁,关联表外键示谁
//JoinTable注解:用于配置多对多关系的
//name属性,用于配置中间表的表名
//joinColumns属性,用于配置当前实体类对应中间表的外键名
//inverseJoinColumns属性:用于配置关联表对应中间表的外键名
@ManyToMany
@JoinTable(name = "tb_student_teacher",joinColumns = @JoinColumn(name = "student_id"),inverseJoinColumns = @JoinColumn(name = "teacher_id"))
private List<Teacher> teachers;

public List<Teacher> getTeachers() {
   return teachers;
}

–测试代码

//需求:通过ID,查询学生信息,然后通过学生查询对应教师信息
@Test
public void findStudentAndTeacher(){
    //第一步:获得操作对象
    EntityManager entityManager = JpaUtils.getEntityManager();
    //第二步:操作-查询
    //查询学习信息
    Student student = entityManager.find(Student.class, 1);
    System.out.println("学生名:"+student.getStudentName());
    List<Teacher> teachers = student.getTeachers();
    for (Teacher teacher : teachers) {
        System.out.println("教师名:"+teacher.getTeacherName());
    }
    //第三步:提交关闭
    entityManager.close();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值