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

如何在Hibernate 5.3.x中设置@Filter参数类型为枚举?

在Hibernate 5.3.x中枚举类型的@ParamDef type值设置方案

嘿,这个问题我太熟悉了!在Hibernate 5.3.x版本里,给枚举类型的过滤器参数设置@ParamDef的type值,得看你枚举是怎么映射到数据库的——毕竟Hibernate处理枚举有两种常见方式,对应的参数类型也不一样,我给你分情况说明:

情况1:枚举默认映射(存储序号)

默认情况下,Hibernate会把枚举按**序号(ORDINAL)**存储到数据库的整数列里(比如MyStatus.STATUS1存0,STATUS2存1)。这时候@ParamDef的type要填integer,和数据库列的类型匹配:

@FilterDef(name = "my_filter", parameters = { 
    @ParamDef(name = "status", type = "integer") 
})
@Filter(name = "my_filter", condition = "status = :status")
@Entity
public class MyEntity{
    // ...
    private MyStatus status;
    // ...
}

情况2:枚举映射为字符串(存储枚举名称)

如果你给枚举字段加了@Enumerated(EnumType.STRING)注解,Hibernate会把枚举的**名称(比如"STATUS1"、"STATUS2")**存储到数据库的字符串列里。这时候@ParamDef的type要填string:

@FilterDef(name = "my_filter", parameters = { 
    @ParamDef(name = "status", type = "string") 
})
@Filter(name = "my_filter", condition = "status = :status")
@Entity
public class MyEntity{
    // ...
    @Enumerated(EnumType.STRING)
    private MyStatus status;
    // ...
}

特殊情况:自定义枚举转换器

如果你用了AttributeConverter自定义了枚举和数据库类型的转换逻辑,那type的值要和转换器最终输出的数据库类型对应——比如转换器把枚举转成VARCHAR就填string,转成INT就填integer。

⚠️ 重要提醒:别直接填枚举类的全限定名(比如com.example.MyStatus),Hibernate 5.3.x的@ParamDef不支持直接用枚举类型作为参数类型,必须用对应的基础数据类型!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:30:51