Spring Boot的JpaRepository如何编写按分类名称查询商品的方法
错误原因
Spring Data JPA 解析方法名时,默认会将下划线_视为嵌套属性的分隔标识。你在Products实体类中的关联分类属性名为product_category,你编写的查询方法名findByProduct_categoryCategoryName会被JPA错误解析为:
- 先查找
Products类下的product属性(该属性不存在,是触发报错的直接原因) - 再查找
product下的category属性 - 最后查找
category下的categoryName属性
完全不符合你实际的实体属性结构。
解决方案
以下三种方案任选一种即可:
方案1:双下划线转义属性名中的下划线
如果不想修改现有实体的命名,只需要把方法名中属性自带的下划线替换为双下划线,让JPA识别为属性名本身的字符而非分隔符:
@Repository public interface ProductRepository extends JpaRepository<Products, Long> { List<Products> findByProduct__categoryCategoryName(String category); }
方案2(更推荐):统一使用Java驼峰命名规范
Java属性命名不建议使用下划线分隔,修改为驼峰命名后可以彻底避免这类解析歧义,操作步骤:
- 将
Products类中的product_category属性修改为productCategory,同步修改对应的get/set方法 - 将
Categories类中@OneToMany注解的mappedBy属性值修改为productCategory - 调整查询方法名为:
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
相关产品推荐
相关产品推荐

