You need to enable JavaScript to run this app. Envers + Spring JPA中revinfo表无法使用user列问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

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」章节,里面会列出该版本所有的保留关键字、非保留关键字的详细说明。

可选解决方案

如果你需要避免这类问题,有两种可选方案:

  1. 优先使用非保留字作为字段名,比如将user改为username、operator_user等,这是最稳妥的方案,不会产生后续的SQL兼容问题
  2. 如果你一定要使用user作为字段名,可以通过双引号转义实现:
    • JPA实体类中给字段加注解@Column(name = "\"user\""),生成SQL时会自动给列名加上双引号,让PostgreSQL将其识别为普通标识符
    • Liquibase建表脚本中也需要将列名写为"user",即<column name="&quot;user&quot;" type="VARCHAR(255)"/>
      注意使用转义方案后,所有手动编写的涉及该字段的SQL都必须给列名加双引号,否则仍然会触发语法错误。

内容的提问来源于stack exchange,提问作者nykon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 03:15:04