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

Spring Boot的JpaRepository如何编写按分类名称查询商品的方法

错误原因

Spring Data JPA 解析方法名时,默认会将下划线_视为嵌套属性的分隔标识。你在Products实体类中的关联分类属性名为product_category,你编写的查询方法名findByProduct_categoryCategoryName会被JPA错误解析为:

  1. 先查找Products类下的product属性(该属性不存在,是触发报错的直接原因)
  2. 再查找product下的category属性
  3. 最后查找category下的categoryName属性
    完全不符合你实际的实体属性结构。

解决方案

以下三种方案任选一种即可:

方案1:双下划线转义属性名中的下划线

如果不想修改现有实体的命名,只需要把方法名中属性自带的下划线替换为双下划线,让JPA识别为属性名本身的字符而非分隔符:

@Repository
public interface ProductRepository extends JpaRepository<Products, Long> {
    List<Products> findByProduct__categoryCategoryName(String category);
}

方案2(更推荐):统一使用Java驼峰命名规范

Java属性命名不建议使用下划线分隔,修改为驼峰命名后可以彻底避免这类解析歧义,操作步骤:

  1. 将Products类中的product_category属性修改为productCategory,同步修改对应的get/set方法
  2. 将Categories类中@OneToMany注解的mappedBy属性值修改为productCategory
  3. 调整查询方法名为:
List<Products> findByProductCategoryCategoryName(String category);

方案3:手动指定JPQL查询

直接自定义查询语句,完全跳过方法名解析逻辑,更灵活不易出错:

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

@Repository
public interface ProductRepository extends JpaRepository<Products, Long> {
    @Query("SELECT p FROM Products p WHERE p.product_category.categoryName = :category")
    List<Products> findByCategoryName(@Param("category") String category);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:54:06