未检测到命名参数

时间:2019-02-10 11:36:00

标签: java hibernate spring-boot jpa

我有一个简单的查询,如下所示。如果按如下方式对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

3 个答案:

答案 0 :(得分:5)

我会改变

 @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

答案 1 :(得分:0)

我遇到了同样的问题:

错误的查询:

SELECT * FROM `cars` as c where c.driver_one = :id OR c.driver_two = **:id;**

正确的查询:

SELECT * FROM `cars` as c where c.driver_one = :id OR c.driver_two = **:id** 

答案 2 :(得分:-1)

这可能是因为您在查询中提供空间的方式。 我的建议是格式化代码,并在字符串引号中使用类似的

SELECT fd.message from FeedDetail AS fd where fd.feedId = :id