Kotlin枚举更新PostgreSQL枚举时出现类型转换错误
解决PostgreSQL枚举与Kotlin枚举原生更新查询的类型转换问题
问题原因
使用Hibernate原生SQL查询时,不会自动应用实体类上配置的PostgreSQLEnumType自定义类型映射,导致Kotlin枚举参数被默认序列化为bytea类型,与数据库的status_type枚举类型不兼容,从而触发转换错误。而save方法能正常工作,是因为它通过实体操作路径,Hibernate会自动处理枚举到PostgreSQL枚举的映射。
解决方案
方案1:将枚举转为字符串参数,SQL内CAST转换
修改仓库方法,将枚举参数替换为其字符串名称,在SQL中显式转换为数据库枚举类型:
@Query( value = """ UPDATE jobs SET status=CAST(:status AS status_type) WHERE id IN :jobIDs """, nativeQuery = true ) fun updateStatus( jobIDs: List<UUID>, @Param("status") status: String )
调用时传入枚举的名称:updateStatus(jobIds, JobStatus.PENDING.name)
方案2:改用HQL查询而非原生SQL
使用HQL查询,让Hibernate自动处理枚举映射,无需手动转换:
@Query( value = """ UPDATE JobMapping j SET j.status = :status WHERE j.id IN :jobIDs """, nativeQuery = false ) fun updateStatus( jobIDs: List<UUID>, status: JobStatus )
HQL会识别实体类上的@Type和TypeDef配置,自动将Kotlin枚举转换为PostgreSQL枚举类型。
方案3:全局配置PostgreSQL枚举类型映射
在Spring Boot配置文件中添加全局属性,让Hibernate对所有枚举默认使用PostgreSQLEnumType:
spring.jpa.properties.hibernate.type.preferred_enum_type=org.hibernate.type.PostgreSQLEnumType
配置后,原生SQL查询中的枚举参数也会被自动转换为对应的PostgreSQL枚举类型,无需修改现有仓库方法。
内容的提问来源于stack exchange,提问作者kamal
相关产品推荐
相关产品推荐

