【问题标题】:Upgrading Hibernate version from 4.3.11.Final to 5.6.3.Final is causing ClassCastException: java.lang.Integer cannot be cast to java.lang.Long将 Hibernate 版本从 4.3.11.Final 升级到 5.6.3.Final 导致 ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
【发布时间】:2022-01-12 08:47:13
【问题描述】:

我有一个应用程序之前使用的是 Hibernate 4.3.11.Final 版本,我决定将 Hibernate 版本升级到 5.6.3.Final。 更改 pom 依赖项 后,一旦我尝试登录/运行应用程序,我就会反复收到 java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

相同的查询在以前的 Hibernate-4 版本中运行良好并返回正确的结果集,但现在升级到 Hibernate-5 后抛出异常。

我想知道这两个版本之间是否存在任何数据类型差异。如何解决此异常。 我还使用 MySQL 进行数据库连接和 jdk-8

下面是我现在拥有的 pom.xml 的快照:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.6.3.Final</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-c3p0</artifactId>
    <version>5.6.3.Final</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.26</version>
</dependency>

代码sn-p如下:

String sqlQuery = "Select user_id, appl_id, user_name from User where delete_flag = 'N'";
NativeQuery sqlQry = hibernateSession.createSQLQuery(sqlQuery);
List<ObjectName> resultList = sqlQry.list();

下面是整个异常日志:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
    at org.hibernate.type.descriptor.java.LongTypeDescriptor.unwrap(LongTypeDescriptor.java:19) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.type.descriptor.sql.BigIntTypeDescriptor$1.doBind(BigIntTypeDescriptor.java:46) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:73) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:276) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:271) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.loader.custom.sql.NamedParamBinder.bind(NamedParamBinder.java:34) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.loader.custom.CustomLoader.bindParameterValues(CustomLoader.java:475) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.loader.Loader.bindPreparedStatement(Loader.java:2150) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:2127) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2059) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2037) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.loader.Loader.doQuery(Loader.java:956) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:357) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2868) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.loader.Loader.doList(Loader.java:2850) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2682) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.loader.Loader.list(Loader.java:2677) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:338) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.internal.SessionImpl.listCustomQuery(SessionImpl.java:2181) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.list(AbstractSharedSessionContract.java:1204) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.query.internal.NativeQueryImpl.doList(NativeQueryImpl.java:177) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1617) ~[hibernate-core-5.6.3.Final.jar:5.6.3.Final]

【问题讨论】:

    标签: java hibernate


    【解决方案1】:
    1. 可能是因为 intInteger,尝试将 int 替换为 Integerlong
    2. 或者您可能会得到一个 long 数字值,该值将存储在 int 类型变量中

    【讨论】:

    • 那么你的意思是,与Hibernate版本升级无关?但是在版本更改之前,相同的代码在早期运行时没有错误。如果我再次降级版本,它运行良好。
    • 我不确定休眠版本,但我在春季启动时遇到了同样的问题,我只是通过将变量更改为包装类来解决它。所以我建议你试试看。
    【解决方案2】:

    我针对这个特定问题得到的首选解决方案是将 Hibernate 版本升级到 Hibernate-5.1.0.Final ,这可能是当前项目环境中的最高工作版本。

    为此,您需要进行的另一个小的额外更改是将 hibernateSession.getTransaction().isActive() 转换为 hibernateSession.getTransaction().getStatus() == TransactionStatus.ACTIVE 。否则会出现编译错误。

    【讨论】:

      猜你喜欢
      • 2018-09-29
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      相关资源
      最近更新 更多