对于 Redshift DB,Hibernate 期望 Long 但找到 BigInteger

Posted

技术标签:

【中文标题】对于 Redshift DB,Hibernate 期望 Long 但找到 BigInteger【英文标题】:For Redshift DB, Hibernate expects Long but finds BigInteger 【发布时间】:2017-05-25 22:53:51 【问题描述】:

我有一个 Hibernate 课程:

@lombok.Data
public class RedshiftRecord 

    @Column(name = "ID")
    private Long id;

Redshift/postgres中该列对应的类型是BIGINT,这里是SQL源码:

CREATE TABLE SAMPLE
(
    id bigint distkey sortkey
);

BIGINT 是一个有符号的八字节整数。但是,当我尝试运行此代码时:

SQLQuery query = getSession().createSQLQuery("SELECT id FROM sample LIMIT 1");
query.setResultTransformer(Transformers.aliasToBean(RedshiftRecord.class));
RedshiftRecord record = (RedshiftRecord) query.uniqueResult();

我收到此错误

org.hibernate.property.BasicPropertyAccessor: IllegalArgumentException in class: com.org.model.RedshiftRecord, setter method of property: id
    org.hibernate.property.BasicPropertyAccessor: expected type: java.lang.Long, actual value: java.math.BigInteger

如果我像这样更改 id:

private BigInteger id;

然后它工作正常。有没有办法让 Hibernate 进行从 Redshift/postgres BIGINT 到 Java Long 的转换? BIGINT 的定义似乎更接近于 Java Long 而不是 Java BigIntger

我不希望使用 BigIntegers 来节省运行时间/空间。

【问题讨论】:

您首先面临的具体问题是什么?发布代码和异常堆栈跟踪。 我添加了错误消息并更好地解释了问题。 @JBNizet 你有什么想法吗? 不。但是你还是没有贴出相关代码:导致异常的实体+代码。 @JBNizet 我想我已经添加了你想要的内容。 【参考方案1】:

@JBNizet 为我指明了正确的方向,但我能够让它与 SQL 查询一起工作。实际上,我在这里遵循了指南:https://www.tutorialspoint.com/hibernate/hibernate_annotations.htm

我在我的模型类上使用了@Entity 注解并替换了

    query.setResultTransformer(Transformers.aliasToBean(RedshiftRecord.class));

 query.addEntity(RedshiftRecord.class);

这让我可以自动将 BIINTS 转换为 Longs。

【讨论】:

以上是关于对于 Redshift DB,Hibernate 期望 Long 但找到 BigInteger的主要内容,如果未能解决你的问题,请参考以下文章

从 db 中检索 Redshift 集群指标

Redshift - 更新 Redshift DB 中的特定列

如何从 mac 连接到 aws Redshift db

如何使用从 s3 到 redshift db 的复制命令解决语法错误

即使 play.ap.db.DB 可以为同一个驱动程序执行此操作,也无法使用驱动程序连接到 Redshift 数据库

hibernate框架配置