使用JPA和Hibernate查询返回重复第一条数据的问题如何解决
问题根因
你的实体类主键配置错误。Hibernate/JPA会通过@Id标注的主键字段区分不同实体实例,你当前仅将hea字段设为主键,但查询到的4条记录hea值完全一致,JPA查询到第一条记录后,发现后续记录的主键值和已缓存的主键值相同,就会直接复用已创建的实体对象,最终导致返回的所有结果都是第一条记录。
解决方案
根据你的表结构情况,可选择以下两种方案:
方案1(推荐):新增唯一主键字段
给HSEC01X表新增一个唯一自增主键字段,比如id,然后修改实体类主键配置:
@Entity @Table(name = "HSEC01X") public class HSEC01X { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "HEA") private String hea; @Column(name = "HNUM") private String hnum; @Column(name = "HNAME") private String hnames; // 补充getter、setter方法 }
该方案符合关系表设计规范,后续维护成本更低。
方案2:使用复合主键
如果无法修改表结构,可通过JPA复合主键规则配置:
- 首先创建复合主键类:
import java.io.Serializable; import java.util.Objects; public class HSEC01XId implements Serializable { private String hea; private String hnum; private String hnames; public HSEC01XId() {} public HSEC01XId(String hea, String hnum, String hnames) { this.hea = hea; this.hnum = hnum; this.hnames = hnames; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; HSEC01XId that = (HSEC01XId) o; return Objects.equals(hea, that.hea) && Objects.equals(hnum, that.hnum) && Objects.equals(hnames, that.hnames); } @Override public int hashCode() { return Objects.hash(hea, hnum, hnames); } }
- 修改实体类配置:
@Entity @Table(name = "HSEC01X") @IdClass(HSEC01XId.class) public class HSEC01X { @Id @Column(name = "HEA") private String hea; @Id @Column(name = "HNUM") private String hnum; @Id @Column(name = "HNAME") private String hnames; // 补充getter、setter方法 }
附加优化建议
你的Controller层接口中hnum参数缺少@RequestParam注解,可能出现参数接收失败的问题,建议修改为:
@GetMapping("/laptops/brandandprice") public ResponseEntity<List<HSEC01X>> getLaptopsByBrandAndPrice(@RequestParam String hea, @RequestParam String hnum) { return new ResponseEntity<>((List<HSEC01X>) hsec01X_repository.findHSEC01XByheaAndhnum(hea, hnum), HttpStatus.OK); }
内容的提问来源于stack exchange,提问作者arriff
相关产品推荐
相关产品推荐

