Hibernate返回BigIntegers而不是long

时间:2013-09-12 07:42:19

标签: java spring hibernate long-integer biginteger

这是我的发件人实体

@Entity
public class Sender {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long senderId;
...


...

    public long getSenderId() {
            return senderId;
    }

    public void setSenderId(long senderId) {
            this.senderId = senderId;
    }
}

当我尝试执行以下查询时:

StringBuilder query = new StringBuilder();
query.append("Select sender.* ");
query.append("From sender ");
query.append("INNER JOIN coupledsender_subscriber ");
query.append("ON coupledsender_subscriber.Sender_senderId = sender.SenderId ");
query.append("WHERE coupledsender_subscriber.Subscriber_subscriberId = ? ");

SQLQuery q = (SQLQuery) sessionFactory.getCurrentSession().createSQLQuery(query.toString());
q.setResultTransformer(Transformers.aliasToBean(Sender.class));
q.setLong(0, subscriberId);

return q.list();

发生以下错误:

  

错误:org.hibernate.property.BasicPropertyAccessor - HHH000123:类中的IllegalArgumentException:be.gimme.persistence.entities.Sender,属性的setter方法:senderId

     

错误:org.hibernate.property.BasicPropertyAccessor - HHH000091:预期类型:long,实际值:java.math.BigInteger

这是因为Sender类中的senderId实际上是一个long而不是BigInteger(由Hibernate返回)。

我想知道在这样的情况下最佳做法是什么,我应该使用BigIntegers作为id(看起来有点矫枉过正)?

我应该手动将查询结果转换为类Sender的对象(那会很糟糕)吗?或者我可以让Hibernate返回long id而不是BigInteger s?还是其他任何想法?

我正在使用Spring,Hibernate 4.1.1和MySQL

5 个答案:

答案 0 :(得分:24)

hibernate中“.list()”的默认值似乎是Numeric的BigInteger返回类型。这是一个解决方法:

session.createSQLQuery("select column as num from table")
  .addScalar("num", StandardBasicTypes.LONG).list();

答案 1 :(得分:3)

对象数据库映射错误。这里有一个转换异常,说数据库字段是BigInteger,但是对象属性是long

BigInteger是一个特殊类,用于保存无限大小的整数值。此外,BigInteger无法隐式转换为长期。

要避免此错误,BigInteger的{​​{1}}字段应更改为long兼容类型。将其更改为int类型,其中int可以隐式地转换为long。请参阅BigInteger

答案 2 :(得分:3)

添加到#Hedley注释以全局修复它,您可以在SQLDialect构造函数中添加一行。 在我的项目中,就像:

public PostgreSQLDialect() {
        super();
        registerHibernateType(Types.BIGINT, StandardBasicTypes.LONG.getName());
    }

答案 3 :(得分:2)

在旧版本的Hibernate中,您可以使用

  session.createSQLQuery("select column as num from table")
 .addScalar("num", Hibernate.LONG).list();

答案 4 :(得分:1)