2017-05-25 37 views
0

我對Hibernate的一類:紅移DB,Hibernate所期待的龍,但發現的BigInteger

@lombok.Data 
public class RedshiftRecord { 

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

在紅移此列中的相應類型/ 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來保存運行時/空間。

+0

您首先面臨的具體問題是什麼?發佈代碼和異常堆棧跟蹤。 –

+0

我添加了錯誤信息並更好地解釋了問題。 –

+0

@JBNizet你有什麼想法嗎? –

回答

0

@JBNizet指出我正確的方向,但我能夠得到它與SQL查詢。實際上,我也跟着指導這裏:https://www.tutorialspoint.com/hibernate/hibernate_annotations.htm

我用@Entity詮釋我的模型類,取而代之

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

query.addEntity(RedshiftRecord.class); 

這讓我自動施放BIGINTS爲long 。