如何在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
相关产品推荐
相关产品推荐

