欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

spring boot data jpa中 联合主键的使用

程序员文章站 2022-04-25 07:54:28
...

0.相关概念

当一个字段无法确定唯一性的时候,需要其他字段来一起形成唯一性。就是说用来组成唯一性的字段如果有多个就是联合主键

学生成绩(学号,课程号,成绩)
那学号和课程号就可以做为联合主键.
因为学号和课程号决定了成绩.也就是说.你要知道成绩..你就要知道学号,知道学号,但还不能知道某一科的成绩.还要知道课程号.
所以函数依赖关系是{学号,课程号}->{成绩}

1.创建

实现联合主键时需先创建一个组合主键类 A,然后在要使用联合主键类 B 的前面加上@idclass 注解
并且保证 对应字段保持一致

下面将以经典的 学生成绩(学号,课程号,成绩) 为例,来进行讲解
public class ScoreMultiKeys implements Serializable{

        protected String sno;
        protected String cno;

        //get,set方法省略
        }
}
@Entity
@IdClass(ScoreMultiKeys.class)//组合主键类
public class Scores {
        @Id  @Column(name = "student_sno",length = 15)  protected   String sno;
        @Id  @Column(name = "course_cno",length = 15) protected String cno;

        //创建外键
        @ManyToOne
        @JoinColumn(name = "student_sno",insertable = false, updatable = false)
        protected   Student student; // 一个学生对应多个成绩
        @ManyToOne
        @JoinColumn(name = "course_cno",insertable = false, updatable = false) protected       Course       course;
        private Integer score;

        
        public Scores(){}
        //不能省略此构造方法
        //否则在将此类创建为数据库中的表时会出错
        
        //get,set方法省略
}

2.使用

复杂查询时需要使用@Query 注解自定义sql语句(HQL 语法格式)
方法的定义

public interface ScoreRespository extends JpaRepository<Scores,ScoreMultiKeys> {
//多表联合查询的sql语句
    @Query("select course.cname,scores.score from Scores scores inner join Course   course  on scores.cno = course.cno where scores.sno = ?1")
    List<Object[]> findDistinctBySnoIgnoreCase(String sno);
        //IgnoreCase 忽略组合主键的另一个条件 按组合主键其中一个进行查询 需要和 @Query 注解   配合使用

            @Query("select student.sname,scores.score from Scores scores inner join Student student  on scores.sno = student.sno where scores.cno = ?1")
    List<Object[]> findDistinctByCnoIgnoreCase(String cno);

}

方法的使用

@Autowired private ScoreRespository scoreRespository;
List<Object[]> scores = scoreRespository.findDistinctBySnoIgnoreCase(sid);
//类型转换 将数据库中查询到的结果(objetc[]类型) 转换为 自定义类型Score_info 
for(int i = 0;i< scores.size();i++)
{
    score_infos.add(new Score_info((String) scores.get(i)[0],(Integer) scores.get(i)[1]));
}