Hibernate returns BigIntegers instead of longs

Tristan Van Poucke picture Tristan Van Poucke · Sep 12, 2013 · Viewed 25.8k times · Source

This is my Sender entity

@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;
    }
}
    

When I try to execute following query:

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();

The following error occures:

ERROR: org.hibernate.property.BasicPropertyAccessor - HHH000123: IllegalArgumentException in class: be.gimme.persistence.entities.Sender, setter method of property: senderId

ERROR: org.hibernate.property.BasicPropertyAccessor - HHH000091: Expected type: long, actual value: java.math.BigInteger

This happens because the senderId in the class Sender is actually a long instead of a BigInteger (which is returned by Hibernate).

I was wondering what the best practice was in a case like this, should I be using BigIntegers as id's (Seems a bit of an overkill)?

Should I convert the query results to objects of class Sender manually (That would be a pitty)? Or can I just make Hibernate return long id's instead of BigIntegers? Or any other ideas?

I'm using Spring, Hibernate 4.1.1 and MySQL

Answer

rogerdpack picture rogerdpack · Apr 6, 2015

The default for ".list()" in hibernate appears to be BigInteger return types for Numeric. Here's one work around:

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