今天刚好有个sql查询,查出来的时候发现数据重复(可能说是覆盖了更为准确些)了,条数是对的,再去debug一遍,发现是jpa自定义的实体类那里出了问题,主键id只有一个,因为查出来的数据是复合主键的,所以只找到了实体类中定义的一个ID,可能就导致了数据覆盖,但条数是正确的,然后自己在sql里处理,写了一种方式来处理这个复合主键,然后上网看了一些资料之后原来还有其他方式来处理复合主键的,主要是在实体类里使用相关注解,还有新建一个类用来存放符合主键的字段,不过我懒,所以就没用网上的方式来处理了,直接用自己的方式在sql语句里处理,懒得又新建一个类,因为就只用一次,所以下面也大概总结讲一下三种复合主键查询的方法(前面两种是看网上说的常用方法):
1,使用注解@Embeddable+EmbeddedId+@AttributeOverrides组合(也叫嵌入式主键),这个方式主要是新建一个复合主键类,然后用@Embeddable来声明这个类是复合主键类,接着在自己定义的另外一个新类中可以继承这个复合类,也可以直接把这个类声明为其中一个属性,在Repository中把这个复合类作为主键返回就行了(继承的时候返回的主键);用@EmbeddedId来声明复合主键的一个id列,@AttributeOverrides是映射到复合类对应的列的注解
2,使用注解@IdClass(复合类.class)+@Id+@Column组合在自定义的实体