我有一个简单的查询,如下所示。如果按如下方式对id值进行硬编码,则可以得到预期的结果。但是,如果我尝试从Param中获取值,则会抛出IllegalArgumentException异常。请注意,我尝试将Param用作long和String并仍然使用相同的结果。请告知我我做错了。谢谢。
我的查询
public interface FeedDetailRepository extends JpaRepository<FeedDetail, Long> {
@Query("select fd.message from FeedDetail as fd where fd.feedId =: id")
String custom(@Param("id") long id);
}
在Controller上,如果运行以下命令,则会出现异常。
@GetMapping("/something/{id}")
public String getDetail(@PathVariable long id){
return feedDetailRepository.custom(id);
}
但是,如果我按如下方式对id值进行硬编码,则会得到所需的结果。
public interface FeedDetailRepository extends JpaRepository<FeedDetail, Long> {
@Query("select fd.message from FeedDetail as fd where fd.feedId = 4")
String getDetailBasedOnFeedId(@Param("id") long id);
}
例外
嵌套的异常是java.lang.IllegalArgumentException:
org.hibernate.QueryException:命名参数未绑定:id
最佳答案
我会改变
@Query("select fd.message from FeedDetail as fd where fd.feedId =: id")
到(差异在于空间)
@Query("select fd.message from FeedDetail as fd where fd.feedId = :id")
对您来说,这是一个很小的差异,但是对于Spring来说,这是很大的差异。他通过像这样将名称附加到冒号来识别参数
:ID
有关更多详细信息,请参见official Spring Data JPA Reference。