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

时间:2017-05-25 22:53:52

标签: java hibernate amazon-redshift

我有一个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

如果我像这样改变身份证:

private BigInteger id;

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

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

1 个答案:

答案 0 :(得分:0)

@JBNizet指出了我正确的方向,但我能够使用SQL查询。实际上,我按照指南进行了操作:https://www.tutorialspoint.com/hibernate/hibernate_annotations.htm

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

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

 query.addEntity(RedshiftRecord.class);

这允许我自动将BIGINTS投射到Longs。