Hibernate批量插入MySQL触发SqlGrammerException问题求助
解决Hibernate批量插入时的SqlGrammarException异常
我帮你排查了一下问题,发现根源出在数据库列名的设计上,这也是使用Hibernate对接MySQL时很容易踩的坑,具体问题点和解决方案如下:
问题原因分析
- 使用了MySQL保留关键字作为列名:你的映射文件中把主键列名设为
CHARACTER,这是MySQL的保留关键字。当Hibernate用hbm2ddl.auto=create创建表时,生成的SQL语句里如果不对关键字做转义,MySQL会直接抛出语法错误。单条插入时可能因为Hibernate的内部处理侥幸运行,但批量插入时就会触发这个问题。 - 列名包含特殊字符未转义:
A.K.A这个列名里的点号(.)在MySQL中会被解析为“表.列”的结构,没有转义的话会被当成语法错误。
解决方案
修改你的Hibernate映射文件userDTO.hbm.xml,调整列名避免关键字,对特殊字符列名进行转义:
修改后的映射文件示例
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "C:\Users\s\.tooling\Desktop\hibernate-mapping-3.0.dtd"> <hibernate-mapping package = "com.aartek.DTO"> <class name="UserDTO" table="WESTEROUS_ISLE"> <!-- 1. 把关键字列名改为非关键字,比如CHARACTER_ID --> <id name="id" column="CHARACTER_ID"> <generator class="increment"></generator> </id> <property name="firstName" column="FIRST_of_his_NAME"></property> <!-- 2. 对含特殊字符的列名用反引号包裹,或者直接改名为AKA --> <property name="aka" column="`A.K.A`"></property> <property name="houseName" column="HOUSE_NAME"></property> </class> </hibernate-mapping>
额外建议
- 开启
show_sql=true后,可以直接查看Hibernate生成的SQL语句,这是排查SQL语法错误最直接的方式——你会看到生成的建表或插入语句里,未转义的关键字/特殊字符导致了语法问题。 - 尽量避免使用数据库的保留关键字作为表名、列名,也尽量不要在列名中使用
.、@这类特殊字符,减少不必要的转义工作。
内容的提问来源于stack exchange,提问作者suyash sahu
相关产品推荐
相关产品推荐

