使用JpaRepository的Native Query时出现SQLGrammarException异常如何解决?
问题根因
你触发SQLGrammarException的核心原因是getUserByName方法的@Query注解加了nativeQuery = true参数,但编写的还是JPQL语法:
nativeQuery = true代表注解内的语句是原生SQL,会直接在数据库执行,需要写实际数据库表名、表字段名,而不是JPA实体类名、实体属性名- 你在语句中写的
UserInfo是实体类名,Hibernate执行原生SQL时会直接把它当做表名拼接,默认转成全小写的userinfo,和你数据库实际的表名不匹配,才会抛出Table 'another_test.userinfo' doesn't exist错误
解决办法
你可以任选一种方案修改:
方案一:改用JPQL查询(推荐,无需关心数据库表命名)
删除nativeQuery = true参数,保持现有查询语句不变即可,修改后代码如下:
/// 修改后正常运行 @Query("select u From UserInfo u WHERE u.name= :n") public List<UserInfo> getUserByName(@Param("n") String name);
这个方案和你已经正常运行的getAllUsers方法逻辑一致,用JPA自带的JPQL语法,面向实体类查询,自动适配数据库表和字段的命名规则。
方案二:保留原生SQL,修改为实际数据库表/字段名
如果确实需要使用原生SQL,把查询语句里的实体类名替换为你数据库实际的表名,字段替换为实际表字段即可。比如你数据库的用户表名为user_info,姓名字段为name,修改后代码如下:
/// 修改后正常运行 @Query(value = "select * From user_info WHERE name= :n",nativeQuery = true) public List<UserInfo> getUserByName(@Param("n") String name);
你可以通过查看数据库的表结构确认实际的表名和字段名,替换到语句中即可。
内容的提问来源于stack exchange,提问作者Ravindra Kushwaha
相关产品推荐
相关产品推荐

