You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动