在我的MySQL数据库中,有"性别枚举('男性','女性')"
我创建了我的枚举"com.mydomain.myapp.enums.Gender",在我的Person实体中我定义了"性别性别".
现在我想在我的MySQL数据库中保留枚举类型,但是当我启动我的应用程序时,我得到:
MyApp.Person中的列类型为Sex的列错误.找到:枚举,预期:整数
为什么是这样?这就好像我用"@Enumerated(EnumType.ORDINAL)"注释了我的"性别性别",我没有.EnumType似乎只能是ORDINAL或STRING,那么如何指定它应该将字段视为枚举,而不是int?(并不是说有太大的不同,但足以让它对此感到不安.)
如何在不支持枚举的数据库中实现枚举字段?(即SQLite)
需要使用" field=?" 轻松搜索字段 所以使用任何类型的数据序列化是一个坏主意.
我有几个表可以是ENUM类型或INT类型的列.我倾向于总是使用整数类型,假设基于它执行搜索会更快.
例如我的表中的一个具有列:StatusType其可具有仅4个可能的值:Completed,In Progress,Failed,Todo.
而不是将上面存储为ENUM字符串,我将它们存储为:
1,2,3,4分别.然后在我的PHP代码中,我有常量变量来定义这些值,如下所示:
define('COMPLETED', 1);
define('IN_PROGRESS', 2);
define('FAILED', 3);
define('TODO', 4);
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,我是以正确的方式做的还是我应该将其更改为ENUM类型并使用字符串来比较查询?我有许多其他列只能有一组最大4-5可能值.
我有一个列表中的枚举(例如)
enum State
{
UP,
DOWN,
RETRY
};
Run Code Online (Sandbox Code Playgroud)
我的数据库中的列是enum类型.当我尝试通过在查询中设置参数来执行Hibernate查询时setParameter("keyword", State.RETRY);,我收到错误
参数值[RETRY]与预期类型[package.name.State(n/a)]不匹配
在我的域的Glassfish 4.1 server.log中.我正在使用Hibernate 4.3.6.
在寻找对Hibernate的源代码,我看到发生了错误,因为线958-960在org.hibernate.jpa.spi.BaseQueryImpl:
private static boolean isValidBindValue(Class expectedType, Object value, TemporalType temporalType) {
if ( expectedType.isInstance( value ) ) {
return true;
}
...
return false;
}
Run Code Online (Sandbox Code Playgroud)
isValidBindValue 返回false,因此我收到消息.
由于这一行,它打印出String相应的enum值:
String.format("Parameter value [%s] did not match expected type [%s (%s)]",
bind,
parameterType.getName(),
extractName( temporalType )
)
Run Code Online (Sandbox Code Playgroud)
该bind目的是通过调用隐式转换为字符串值toString的方法Object,它表示enum State.RETRY.
那我怎么能说服Hibernate这 …