Spring Data JPA 类型转换异常:无法将 Integer 转换为 Long。

4

在我的Spring Data应用程序中,我遇到了类似于此处描述的问题:ClassCastException:Integer不能强制转换为Long,尝试迭代实体ID时

这是我的实体:

@Table(name = "users")
public class User extends BaseEntity implements Serializable {

    private static final long serialVersionUID = 5088960286161030648L;

    @Id
    @SequenceGenerator(name = "users_id_seq", sequenceName = "users_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "users_id_seq")
    private Long id;
...
}

以及Spring Data Repository方法:

@Query(value = "SELECT u.user_id FROM users u WHERE u.game_id =:gameId", nativeQuery = true)
List<Long> getGameIds(@Param("gameId") Long gameId);

这段代码预计返回一个Long类型的List,但实际执行后返回了一个Integer类型的List,并且应用程序因此失败并出现以下错误:

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

如何告诉Spring Data或JPA在结果列表中返回Long(而不是Integer)的List?

我不想在运行时进行值转换(从Integer到Long)。

此外,我的应用程序的主要标准是性能,那么将我的实体中所有ID从Long更改为Integer是个好主意吗?在JPA中是否使用Integer代替Long作为实体ID是一种良好的做法吗?

更新

我使用的是PostgreSQL数据库

对于:user_id INTEGER,我收到的错误是:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

对于:user_id BIGINT,我收到的错误是:java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long


4
你是否尝试过使用非本地查询而是JPQL,例如“select id from User where ...”? - Stan
检查 entityId 所在的列的数据库类型,为该列选择合适的类型以及 Java 类中对应属性的兼容类型,这样就不会出现此问题。 - Bilbo Baggins
你使用哪个数据库? - Jaiwo99
我正在使用PostgreSQL。我已更新我的问题并添加了有关我的“user_id”数据类型的更多信息。 - alexanoid
你尝试在@Query注释中包含"resultClass=Long.class"了吗? - RubioRic
显示剩余2条评论
1个回答

3

问题在于当您使用本地查询时,Long类与您的数据库类型不匹配——getLong在这里无法工作。因此,您应该执行以下操作之一:

  1. 将数据库和应用程序中的类型更改为BigInteger(如果整数不足以满足您的需求)。
  2. 将数据库和应用程序中的类型更改为Integer(如果它足以满足您的需求)。
  3. 删除nqtiveQuery属性并使用清晰的JPQL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接