Envers + Spring JPA中revinfo表无法使用user列问题咨询
问题原因
user是PostgreSQL的保留关键字,SQL解析器执行语句时会优先将user识别为系统内置的关键字/函数,而不是普通的自定义列名,所以你写的插入语句insert into revinfo (timestamp, user, rev) values ($1, $2, $3)会触发语法错误。该问题和Envers、revinfo表本身没有关联,任何PostgreSQL表只要直接用user作为列名都会出现相同报错。
同类特殊字段名
所有PostgreSQL的保留关键字都不能直接作为列名、表名等自定义标识符使用,常见的同类型关键字还包括:
order、group、by、limit、offset这类SQL语法关键字default、distinct、primary、foreign这类约束/语法关键字current_date、current_time、session_user这类系统内置标识符
不同版本的PostgreSQL保留关键字列表会有细微差异。
相关说明查询渠道
你可以查阅你正在使用的PostgreSQL版本官方文档中的「SQL Key Words」章节,里面会列出该版本所有的保留关键字、非保留关键字的详细说明。
可选解决方案
如果你需要避免这类问题,有两种可选方案:
- 优先使用非保留字作为字段名,比如将
user改为username、operator_user等,这是最稳妥的方案,不会产生后续的SQL兼容问题 - 如果你一定要使用
user作为字段名,可以通过双引号转义实现:- JPA实体类中给字段加注解
@Column(name = "\"user\""),生成SQL时会自动给列名加上双引号,让PostgreSQL将其识别为普通标识符 - Liquibase建表脚本中也需要将列名写为
"user",即<column name=""user"" type="VARCHAR(255)"/>
注意使用转义方案后,所有手动编写的涉及该字段的SQL都必须给列名加双引号,否则仍然会触发语法错误。
- JPA实体类中给字段加注解
内容的提问来源于stack exchange,提问作者nykon
相关产品推荐
相关产品推荐

