工作中遇到这样的一个问题,使用Spring Data JPA插入数据时候,dao层报这个错:
SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement
意思大概是:
SQL语句错误了,所以不能继续执行。
走查了很久,感觉自己代码没问题,以前使用save() 操作都挺顺溜啊,怎么突然就报错了,然后看了一眼SQL报错的内容:
SQL Error: 1064, SQLState: 42000
上百度一查,原来是SQL语句里面有保留关键字,表结构如下:
CREATE TABLE `table` (
`id` varchar(50) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '主键id',
`key` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
`value` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC;
JPA底层在运行SQL的时候,是这样执行的:
insert into table (id, key, value) values (?, ?, ?);
key 作为SQL的保留字,执行起来就会报1064 42000的错了。要么,建表的时候避免这些关键字,要么,使用这个符号:`
我当时不想修改字段名,因为好几个环境要跟着改,很麻烦,所以我直接就使用了第二种方法。
@Column(name = "`value`", columnDefinition = "varchar(255) comment '值'")
private String value;
就是键盘左上角那个波浪号
在entity类的注解加这个符号之后,JPA执行的SQL是这样的:
insert into table (id, `key`, `value`) values (?, ?, ?);
以后,什么key,value,order,index都可以拿来建表了,多么的方便呀,哈哈哈~~