You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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复合主键规则配置:

  1. 首先创建复合主键类:
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);
    }
}
  1. 修改实体类配置:
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 10:21:01