Spring Data JPA Specification结合OneToMany关联时关联字段错误排查
问题根因
你的代码核心错误出在FishingLocation实体类的@OneToMany注解配置上:
@OneToMany的mappedBy属性用于指定关联关系由对方(多的一方)的哪个实体属性维护,你当前填写的是"id",会被Hibernate识别为Lake实体的主键id是维护该关联的外键,所以生成的SQL关联条件为两个表的主键相等,和你遇到的错误完全匹配。- 正确的
mappedBy取值应该是Lake类中关联FishingLocation的属性名,也就是"fishingLocation"。
另外建议补充Lake实体@JoinColumn的显式配置,避免不同Hibernate版本默认外键命名规则不同导致的异常:@JoinColumn(name = "fishing_location_id"),这个配置和你预期的外键字段名完全匹配。
修改后的代码示例
1. FishingLocation实体调整
@Entity @Table(name = "tbl_fishing_location") public class FishingLocation { ... @JsonIgnore // 仅修改mappedBy的取值即可 @OneToMany(mappedBy = "fishingLocation", fetch = FetchType.EAGER) private List<Lake> lakeList; ... }
2. Lake实体调整(可选优化,建议配置)
@Entity @Table(name = "tbl_lake") public class Lake { ... @JsonIgnore @ManyToOne // 显式指定外键字段名,和你预期的数据库字段一致 @JoinColumn(name = "fishing_location_id") private FishingLocation fishingLocation; ... }
生效说明
修改完上述实体配置后,不需要调整你现有的Specification动态查询逻辑,重启项目后Hibernate生成的关联SQL就会符合你预期的on fishingloc0_.id=lakelist4_.fishing_location_id。
内容的提问来源于stack exchange,提问作者Đức Anh Trần
相关产品推荐
相关产品推荐

