我有一个包含枚举类型属性的表,如下所示:
@Enumerated(EnumType.ORDINAL)
@Column(name = "status")
private Enums.Status status;
Enums.Status
的位置public enum Status {
CHECKED(1),
DISABLED(2),
INACTIVE(3);
int id;
// constructor + getter
}
数据库中的列状态存储为类型int4
我使用以下HQL查询表:
Query q = session.createQuery(" from Users where status=:account");
query.setParameter("account", Enums.Status.CHECKED);
List<Users> users = query.list();
上面的代码在我的测试服务器上工作正常,但是在生产服务器上它会抛出以下异常:
org.hibernate.exception.DataException: Bad value for type int : t
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:134)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.proxy.AbstractResultSetProxyHandler.continueInvocation(AbstractResultSetProxyHandler.java:108)
at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
at com.sun.proxy.$Proxy30.getInt(Unknown Source)
at org.hibernate.type.EnumType$OrdinalEnumValueMapper.getValue(EnumType.java:358)
at org.hibernate.type.EnumType.nullSafeGet(EnumType.java:105)
at org.hibernate.type.CustomType.nullSafeGet(CustomType.java:127)
at org.hibernate.type.AbstractType.hydrate(AbstractType.java:106)
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2873)
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1668)
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1600)
at org.hibernate.loader.Loader.getRow(Loader.java:1500)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:712)
at org.hibernate.loader.Loader.processResultSet(Loader.java:940)
at org.hibernate.loader.Loader.doQuery(Loader.java:910)
我尝试用其.ordinal()
值替换enum参数,但收到了另一个异常。我试着查看测试服务器和生产服务器之间的差异,但他们都使用相同的java版本,hibernate库,表和表内容的数据类型。
有没有人遇到任何类似的问题,或者有任何想法如何修复?
答案 0 :(得分:1)
对于Java Enums,术语ordinal
不是指id
属性,而是指Enum
类的内置属性。请参阅JavaDocs for the ordinal()
method。
返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。大多数程序员都没有使用这种方法。它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap。
请注意,第一个序数为0(零)而不是1
不要自己调用ordinal()
方法;让Hibernate这样做。
答案 1 :(得分:1)
我已经找到了问题所在。在我们的例子中,生产服务器有多个模式,其中一个数据库更新失败,导致一个字段具有与其hibernate映射不同的数据类型。
如果有人到这里寻找同一错误的答案,请尝试以下方法: