jpa无主键表查询结果重复(复合主键的使用)

时间:2024-04-13 11:07:53

jpa要求数据表映射的实体类必须有id,但是实际的表中往往是没有主键的,如果在实体中随便给某个属性添加@id注解,那么在使用查询时得到的结果往往是相同的,比如下面的例子:

数据表:表中videoID不是主键(在其他表中它是主键)
jpa无主键表查询结果重复(复合主键的使用)

表映射的实体:因为实体必须要有@id,所以我把注解添加到videoID
jpa无主键表查询结果重复(复合主键的使用)
使用jpa 提供的方法查询所有数据
jpa无主键表查询结果重复(复合主键的使用)

查询结果:videoID相同的查询结果都相同,也就是所有结果中查找到的都是相同videoID的那些数据的第一行,看我的表查找到的全都是第一集
jpa无主键表查询结果重复(复合主键的使用)

解决方案:使用复合主键

观察我上面的表,videoID虽然不是这个表的主键,但是加上sortID后,它们两个可以组合成主键(视频的id加上视频的某一集可以成为唯一识别标识)

1、另外创建一个实体:需要实现序列化,不用添加任何注解,属性就是组合在一起能成为的唯一标识的字段,也不用写set方法和get方法,这个实体的意思就是它整个就是一个id(属性名和表的字段名相同)
jpa无主键表查询结果重复(复合主键的使用)
2、给表映射的实体添加注解,给表添加@IdClass,给那两个属性添加@Id
jpa无主键表查询结果重复(复合主键的使用)

再次看查询结果:
jpa无主键表查询结果重复(复合主键的使用)