如何通过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
相关产品推荐
相关产品推荐

