美文网首页spring boot 学习笔记
spring boot data jpa中 联合主键的使用

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

作者: wnyto | 来源:发表于2018-05-07 17:34 被阅读120次

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]));
}

相关文章

网友评论

    本文标题:spring boot data jpa中 联合主键的使用

    本文链接:https://www.haomeiwen.com/subject/wqrvrftx.html