SQLGrammarException报错排查:数据保存时无法执行语句
问题分析与修复方案
1. SQL语句语法错误(直接触发异常的原因)
你的@Query中的INSERT语句缺少结尾的右括号,这是导致SQLGrammarException的核心问题。修复后的语句如下:
@Modifying @Transactional @Query(value = "insert into student (id, name, roll, class) values (:id, :name, :roll, :class)", nativeQuery = true) void saveStudent(String id, String name, String roll, String class);
2. SQL关键字冲突问题
class是SQL的保留关键字,直接作为列名使用会引发语法解析错误,需要用对应数据库的转义符包裹:
- MySQL使用反引号:
`class` - PostgreSQL使用双引号:
"class" - Oracle使用双引号或自定义前缀
以MySQL为例,修改后的SQL:
@Query(value = "insert into student (id, name, roll, `class`) values (:id, :name, :roll, :class)", nativeQuery = true)
3. 实体类与数据库表不匹配(潜在隐患)
你的Student实体类标注的@Table(name = "area"),但Repository的SQL操作的是student表,这会导致ORM操作与原生SQL操作的表不一致,建议统一表名:
要么把实体类的@Table改为@Table(name = "student"),要么把SQL中的表名改为area。
4. 参数命名优化(可选)
class是Java的关键字,作为方法参数可读性差,建议重命名为className,同步修改SQL参数绑定:
@Modifying @Transactional @Query(value = "insert into student (id, name, roll, `class`) values (:id, :name, :roll, :className)", nativeQuery = true) void saveStudent(String id, String name, String roll, String className);
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

