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

Query enum in hibernate throws DataException: Bad value for type int : t

我有一个 table,其枚举类型属性映射如下:

@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 查询 table:

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() 值替换枚举参数,但收到另一个异常。我尝试查找测试服务器和生产服务器之间的差异,但它们都使用相同的 java 版本、hibernate 库、table 和 table 内容的数据类型。

有没有人遇到过任何类似的问题或知道如何解决它?

对于 Java 枚举,术语 ordinal 不是指 id 属性,而是 属性 的内置 属性 12=] class。参见 JavaDocs for the ordinal() method

Returns the ordinal of this enumeration constant (its position in its enum declaration, where the initial constant is assigned an ordinal of zero). Most programmers will have no use for this method. It is designed for use by sophisticated enum-based data structures, such as EnumSet and EnumMap.

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

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

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

如果有人来到这里寻找相同错误的答案,请尝试以下操作:

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