Spring集成HSQLDB-2.5.1遇TEXT[]类型异常的解决求助
解决HSQLDB 2.5.1中数组类型字段的建表问题
问题背景
- Spring应用连接HSQLDB 2.5.1,实体类包含
text[]、int8[]类型的数组字段 - 直接执行DDL时抛出异常:
type not found or user lacks privilege's: TEXT - 给数据源URL添加
sql.syntax_pgs=true后,出现新异常:unexpected token [
解决方案
1. 使用HSQLDB原生数组语法
HSQLDB本身支持数组类型,但语法和PostgreSQL不同,不用方括号[],改用ARRAY关键字定义,同时对应好类型映射:
- PostgreSQL的
text[]对应HSQLDB的VARCHAR ARRAY - PostgreSQL的
int8[]对应HSQLDB的BIGINT ARRAY
修改后的DDL语句:
create table PUBLIC.abcs ( id bigint not null, createdBy varchar(255), createdDate timestamp, lastModifiedBy varchar(255), lastModifiedDate timestamp, columnName varchar(35) not null, types VARCHAR ARRAY not null, methId varchar(255), paraValues VARCHAR ARRAY, tables BIGINT ARRAY not null, prId bigint not null, primary key (id) )
2. 同步调整实体类的columnDefinition
修改实体类中字段的columnDefinition,匹配HSQLDB的原生语法:
@Entity @Table(name = "abcs") @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @Indexed public class Abc extends LongEntity<Abc> { private static final long serialVersionUID = 1L; @Column(name = "columnName", length = ColumnName.MAX_DB_LENGTH, nullable = false) private String columnName; @Column(name = "tables", nullable = false, columnDefinition = "BIGINT ARRAY") @Type(type = "com.pkg.GenericArrayUserType", parameters = { @Parameter(name = "type", value = "bigint") }) private Long[] abcIds; @Column(name = "types", nullable = false, columnDefinition = "VARCHAR ARRAY") @Type(type = "com.pkg.GenericArrayUserType", parameters = { @Parameter(name = "type", value = "varchar") }) private String[] daTypes; }
3. 移除PostgreSQL语法兼容参数
不需要在数据源URL中加sql.syntax_pgs=true,HSQLDB的数组语法和PostgreSQL不兼容,启用该参数后会导致方括号[]被识别为非法token,引发解析错误。
4. 适配自定义数组类型处理器
检查自定义的GenericArrayUserType是否支持HSQLDB的数组处理逻辑:
- 字符串数组对应HSQLDB的JDBC类型
Types.ARRAY,元素类型为VARCHAR - 长整型数组元素类型为
BIGINT
如果处理器中有PostgreSQL专属逻辑,需调整为HSQLDB兼容的通用逻辑。
验证步骤
- 启动Spring应用,观察Hibernate自动建表是否成功
- 插入含数组字段的数据,验证读写操作正常
- 执行查询,确认数组字段能正确映射到实体类的数组属性
内容的提问来源于stack exchange,提问作者vishal bhardwaj
相关产品推荐
相关产品推荐

