hibernate中的查询枚举抛出DataException:类型int:t的错误值

时间:2016-04-19 07:01:47

标签: java hibernate enums hql

我有一个包含枚举类型属性的表,如下所示:

@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库,表和表内容的数据类型。

有没有人遇到任何类似的问题,或者有任何想法如何修复?

2 个答案:

答案 0 :(得分:1)

对于Java Enums,术语ordinal不是指id属性,而是指Enum类的内置属性。请参阅JavaDocs for the ordinal() method

  

返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。大多数程序员都没有使用这种方法。它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap。

请注意,第一个序数为0(零)而不是1

不要自己调用ordinal()方法;让Hibernate这样做。

答案 1 :(得分:1)

我已经找到了问题所在。在我们的例子中,生产服务器有多个模式,其中一个数据库更新失败,导致一个字段具有与其hibernate映射不同的数据类型。

如果有人到这里寻找同一错误的答案,请尝试以下方法:

  • 对于枚举,请验证db中的数据类型是否为整数,以便映射@Enumerated(EnumType.ORDINAL)(或者enumType.STRING的varchar)
  • 验证该表的所有其他数据类型是否与hibernate映射匹配
  • 验证db内的值是否超过枚举
  • 中的项目数
  • 验证所有架构中的数据(如果您使用的是多个)
  • 如果您在一台服务器而不是另一台服务器上遇到此错误,请检查以下差异:jdk版本,hibernate-core版本,数据库驱动程序版本。如果它们都相同,请尝试将数据库从一个服务器转储到另一个服务器