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

如何通过JpaRepository获取Spring嵌套对象的子分类数据

错误原因

findAllBySubProduceCategoryId方法命名不符合JPA规则:JPA查询方法是基于实体属性解析的,subProduceCategoryId是关联表subProduceCategories的数据库字段,并非ProduceCategoryModel实体中的属性,因此JPA无法识别该字段导致启动报错。


解决方案(无需新建模型)

基于你当前的ManyToMany自关联结构,提供两种实现方式:

方案1:使用JPA方法命名规则(查找包含指定子分类的父分类)

如果需求是获取所有包含某ID子分类的父分类列表,直接利用实体中的subCategories属性定义方法:

// 查找所有包含指定ID子分类的父分类
List<ProduceCategoryModel> findBySubCategories_Id(int subCategoryId);

JPA会自动解析为:查询subCategories集合中存在ID等于subCategoryId的父分类。

方案2:自定义JPQL查询(根据父ID获取子分类列表)

如果需求是根据父分类ID获取其下的所有子分类,通过@Query注解编写JPQL实现:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

// 根据父分类ID获取对应的子分类列表
@Query("SELECT sc FROM ProduceCategoryModel p JOIN p.subCategories sc WHERE p.id = :parentId")
List<ProduceCategoryModel> findSubCategoriesByParentId(@Param("parentId") int parentId);

该查询会关联父分类与子分类的中间表,返回指定父分类下的所有子分类数据。


额外优化建议(可选,无需新建模型)

当前ManyToMany关联更适合“一个子分类属于多个父分类”的场景。如果你的分类是树形结构(每个子分类仅对应一个父分类),可以直接修改实体关联方式为OneToMany+ManyToOne自关联:

// 添加父分类关联
@JsonIgnore
@ManyToOne
@JoinColumn(name = "parentCategoryId")
private ProduceCategoryModel parentCategory;

// 修改子分类关联为OneToMany
@OneToMany(mappedBy = "parentCategory", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<ProduceCategoryModel> subCategories;

同时删除原有的@ManyToMany和@JoinTable注解,这种结构更贴合树形分类逻辑,查询子分类可直接用:

List<ProduceCategoryModel> findByParentCategory_Id(int parentId);

内容的提问来源于stack exchange,提问作者erhanck

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 06:52:00