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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:21:12