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

Quarkus JUnit5测试H2数据库SQL语法错误及循环引用问题解决

问题解析与解决方案

关于「CIRCULAR REFERENCE」标记的说明

这里的CIRCULAR REFERENCE并不是指实体类之间存在循环引用关系,它是H2数据库在抛出语法错误时的内部标记,用来定位SQL语句中的错误位置([*]指向的KEY就是问题点)。

错误根源

KEY是H2数据库的保留关键字,当你通过@ElementCollection定义Map集合并将键列名设为KEY时,Hibernate生成的SQL语句会直接使用KEY作为列名,导致H2解析SQL时触发语法错误。而Oracle数据库中KEY并非保留字,所以不会出现该问题。

解决方法

方案1:修改列名(推荐)

直接将键列名改为非保留字,比如INDEX_KEY,通过@MapKeyColumn注解指定:

@ElementCollection
@CollectionTable(name = "FILENET_INDEXES")
@MapKeyColumn(name = "INDEX_KEY")
@Column(name = "INDEX_VALUE")
private Map<String, String> filenetIndexes;

方案2:强制给列名加引号(保留原列名)

如果必须使用KEY作为列名,可以通过注解给列名添加双引号,让H2将其视为普通标识符:

@ElementCollection
@CollectionTable(name = "FILENET_INDEXES")
@MapKeyColumn(name = "\"KEY\"")
@Column(name = "INDEX_VALUE")
private Map<String, String> filenetIndexes;

这样Hibernate生成的SQL会将KEY用双引号包裹,避免触发保留字冲突。

方案3:全局设置Hibernate引号策略(适用于多个类似场景)

在Quarkus配置文件(application.properties)中添加以下配置,让Hibernate对所有标识符自动添加引号:

quarkus.hibernate-orm.quoted-identifiers=true

该配置会让Hibernate生成的所有表名、列名都带上引号,彻底避免保留字冲突,但会导致SQL语句可读性略有下降。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:30:00