Spring Data JPA ClassCastException:Integer不能强制转换为Long

时间:2016-05-09 08:54:05

标签: java spring hibernate jpa spring-data

在我的Spring Data应用程序中,我遇到了这里描述的类似问题ClassCastException: Integer cannot be cast to Long, while trying to iterate over entity IDs

这是我的实体:

@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但是在执行后返回整数List并且应用程序失败并且

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

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

我不想在运行时强制转换值(Integer to 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

1 个答案:

答案 0 :(得分:2)

问题是当您使用本机查询Long时,类与您的数据库类型不相关 - getLong在那里不起作用。所以你应该做以下其中一个

  1. 将db和app中的类型更改为BigInteger(如果整数不足以满足您的需求)
  2. 将db和app中的类型更改为Integer(如果它足以满足您的需求)
  3. 删除nqtiveQuery属性并使用clear JPQL。