对于 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的主要内容,如果未能解决你的问题,请参考以下文章
Redshift - 更新 Redshift DB 中的特定列
如何使用从 s3 到 redshift db 的复制命令解决语法错误