Spring cloud Jpa 的三种复合主键查询(实体类操作,sql语句里操作)

    今天刚好有个sql查询,查出来的时候发现数据重复(可能说是覆盖了更为准确些)了,条数是对的,再去debug一遍,发现是jpa自定义的实体类那里出了问题,主键id只有一个,因为查出来的数据是复合主键的,所以只找到了实体类中定义的一个ID,可能就导致了数据覆盖,但是条数是正确的,然后自己在sql理处理,写了一种方式来处理这个复合主键,然后上网看了一些资料之后原来还有其他方式来处理复合主键的,主要是在实体类里使用相关注解,还有新建一个类用来存放符合主键的字段,不过我懒,所以就没用网上的方式来处理了,直接用自己的方式在sql语句里处理,懒得又新建一个类,因为就只用一次,所以下面也大概总结讲一下三种复合主键查询的方法(前面两种是看网上说的常用方法):

 

1,使用注解@Embeddable+EmbeddedId+@AttributeOverrides组合(也叫嵌入式主键),这个方式主要是新建一个复合主键类,然后用@Embeddable来声明这个类是复合主键类,接着在自己定义的另外一个新类中可以继承这个复合类,也可以直接把这个类声明为其中一个属性,在Repository中把这个复合类作为主键返回就行了(继承的时候返回的主键);用@EmbeddedId来声明复合主键的一个id列,@AttributeOverrides是映射到复合类对应的列的注解

 

2,使用注解@IdClass(复合类.class)+@Id+@Column组合在自定义的实体类中声明

以上的两种方法都是在实体类里操作的,都是网上看到的方法,也没怎么详细研究,是可行的,下面的第三种方法是直接在SQL语句里操作的:

 

3,直接在sql语句里操作,把复合主键字符串连接起来就可以作为一个唯一的主键了,用别名id返回,对应实体类中声明的id列;这种方法挺局限的,对于一些多主键的也不好操作,所以还有一种方式就是在sql里用变量生成一个排序号,把这个排序号作为id列返回就好了,如下(声明的变量@i :=0,注意转移字符:号,直接用双斜杆转义\\:):

Spring cloud Jpa 的三种复合主键查询(实体类操作,sql语句里操作)_第1张图片

            仅代表个人观点,欢迎各位大佬随时指点,谢谢!

你可能感兴趣的:(spring,clound,java后端,spring,jpa,java,sql)