You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HSQL服务器与内存模式处理SQL保留关键字的差异问题

HSQL服务器模式与内存模式兼容保留关键字表名的问题

背景与生产环境配置

  • 小型Spring Boot应用,采用HSQL服务器模式作为数据库,通过Liquibase维护Schema,运行状态正常:
    spring.datasource.url=jdbc:hsqldb:hsql://localhost:5678/mydb
    
  • 其中一个实体类名称为SQL保留关键字Group:
    @Entity
    public class Group
    
  • 该配置下Liquibase可正常创建表,应用也能正常使用此JPA实体。

集成测试环境出现的问题

为编写集成测试避免回归问题,启用了HSQL内存模式:

spring.datasource.url=jdbc:hsqldb:mem:mydb;DB_CLOSE_DELAY=-1

测试初始化时,其他实体均可正常创建,仅Group实体报错:

org.hsqldb.HsqlException: user lacks privilege or object not found: GROUP

执行的SQL语句为:

insert into group (code,lazylock,name,period_id,tenant_id,uid,id) values (?,?,?,?,?,?,default)

但日志显示表已成功创建:

07:07:27.942 [main] INFO  liquibase.changelog - Table group created
07:07:27.943 [main] INFO  liquibase.changelog - Unique constraint added to group(period_id,code)
07:07:27.943 [main] INFO  liquibase.changelog - Unique constraint added to group(uid)

修改实体配置后的冲突

通常给表名加引号可解决保留关键字作为表名的问题,于是修改实体配置:

@Entity
@Table(name = "`group`")
public class Group

此时集成测试可正常运行,但生产应用本身却抛出异常:

org.hsqldb.HsqlException: user lacks privilege or object not found: group in statement [select g1_0.id,g1_0.code,g1_0.lazylock,g1_0.name,g1_0.period_id,g1_0.tenant_id,g1_0.uid from "group" g1_0 where g1_0.period_id=? order by g1_0.code]

可见HSQL服务器模式与内存模式对保留关键字的处理存在差异。将表名改为group2时两种模式均正常,但我希望保留group作为表名。

重命名表的失败尝试

尝试在已填充数据的数据库中重命名该表,多次尝试均未成功:

alter table group rename to groups;

[Code: -5581, SQL State: 42581] unexpected token: GROUP

alter table "group" rename to groups;

[Code: -5501, SQL State: 42501] user lacks privilege or object not found: PUBLIC.group

alter table 'group' rename to groups;

[Code: -5581, SQL State: 42581] unexpected token: group

注:数据库中确实存在group表。

提问

是否存在URL参数或Hibernate配置可实现两种模式兼容?我已查阅资料但未找到解决方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:01:17