Spring Data 实体属性命名避坑:MySQL 保留关键字处理
在使用 Spring Data 构建项目时,经常遇到将 MySQL 保留字直接用作实体属性的情况。比如 condition,这会导致 Hibernate/Spring Data 生成的 SQL 出现语法错误。
问题背景
项目中用 Spring Data 将 CONDITION 作为属性名时,SQL 报错是常见现象。这是因为 ORM 框架在生成查询语句时,会直接将属性名映射为列名,而保留字在 SQL 解析阶段会被视为指令而非标识符。
解决方案
方案一:原生 SQL 转义
如果必须使用原生 SQL,记得加反引号包裹字段名。例如:
SELECT name, `condition` FROM products WHERE id = ?
注意:这里建议使用预编译参数(如 ?)代替字符串拼接,避免 SQL 注入风险。
方案二:JPA 注解映射(推荐)
更优雅的方式是通过 @Column 注解将属性映射到合法的数据库列名。这样代码中的属性名可以保持语义化,而底层数据库列名则规避了冲突。
/**
* 备件状态
*/
@Column(name = "materialCondition")
private String condition;
这种方式既保持了 Java 代码的可读性,又确保了数据库交互的稳定性,是生产环境的首选方案。
常见保留关键字表
以下是 MySQL 常见的保留关键字列表,开发时请尽量避免直接使用这些词作为表名或字段名。
| ADD | ALL | ALTER |
| ANALYZE | AND | AS |
| ASC | ASENSITIVE | BEFORE |
| BETWEEN | BIGINT | BINARY |
| BLOB | BOTH | BY |
| CALL | CASCADE | CASE |
| CHANGE | CHAR | CHARACTER |
| CHECK | COLLATE | COLUMN |
| CONDITION | CONNECTION | CONSTRAINT |
| CONTINUE | CONVERT | CREATE |
| CROSS | CURRENT_DATE | CURRENT_TIME |
| CURRENT_TIMESTAMP | CURRENT_USER | CURSOR |
| DATABASE | DATABASES | DAY_HOUR |

