Spring JPA @Query注解参数不匹配引发可选参数异常问题咨询
问题原因与解决方案
嘿,这个问题其实是典型的参数名称不匹配导致的小疏漏,我帮你拆解清楚:
你看,你在@Param注解里指定的参数名是category_id,但在JPQL查询语句里引用的参数却是:id——两者完全对不上!JPA在解析的时候,会根据@Param声明的名称去匹配查询里的参数占位符,结果找不到叫category_id的占位符,自然就抛出了这个异常。
另外还有个隐藏的小坑要提醒你:你的查询语句是从Category关联查询products,但方法返回的是List<Product>,这其实会出问题——因为inner join fetch c.products查询出来的是附带加载了products的Category对象,直接转成Product列表会引发类型转换错误,这个是你后续大概率会碰到的问题,提前给你指出来。
修正后的两种方案代码
// 方案1:想查询带关联产品的分类,返回Category类型 @Query("from Category c inner join fetch c.products where c.id=:categoryId") Category findCategoryWithProductsById(@Param("categoryId") int categoryId); // 方案2:确实只需要返回该分类下的产品列表,调整JPQL语句 @Query("select p from Category c inner join c.products p where c.id=:categoryId") List<Product> findProductsByCategoryId(@Param("categoryId") int categoryId);
核心注意点
- 一定要保证
@Param的参数名和JPQL里的:参数名完全一致,大小写也不能错 - 搞清楚JPQL的返回结果类型,和方法的返回类型必须匹配:
- 用
from Category ... join fetch返回的是Category对象(已预加载关联的products) - 用
select p from Category ... join p返回的才是关联的Product集合
- 用
内容的提问来源于stack exchange,提问作者İhsan Tarık




