Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate returns BigIntegers instead of longs

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

like image 771
Tristan Van Poucke Avatar asked Sep 12 '13 07:09

Tristan Van Poucke


3 Answers

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();
like image 77
rogerdpack Avatar answered Nov 07 '22 08:11

rogerdpack


In older versions of Hibernate you can use

  session.createSQLQuery("select column as num from table")
 .addScalar("num", Hibernate.LONG).list();
like image 36
Crozeta Avatar answered Nov 07 '22 06:11

Crozeta


Adding to #Hedley comment to fix it globally you can add a line in SQLDialect constructor. In my project it was like:

public PostgreSQLDialect() {
        super();
        registerHibernateType(Types.BIGINT, StandardBasicTypes.LONG.getName());
    }
like image 5
Алексей Виноградов Avatar answered Nov 07 '22 08:11

Алексей Виноградов