17

这是我的发件人实体

@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,属性的设置方法:senderId

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

发生这种情况是因为 Sender 类中的 senderId 实际上是 long 而不是 BigInteger(由 Hibernate 返回)。

我想知道在这种情况下最好的做法是什么,我应该使用 BigIntegers 作为 id(似乎有点矫枉过正)?

我应该手动将查询结果转换为 Sender 类的对象吗(那会很可惜)?或者我可以让 Hibernate 返回longid 而不是BigIntegers?还是有其他想法?

我正在使用 Spring、Hibernate 4.1.1 和 MySQL

4

5 回答 5

31

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

session.createSQLQuery("select column as num from table")
  .addScalar("num", StandardBasicTypes.LONG).list();
于 2015-04-06T21:04:36.450 回答
5

In older versions of Hibernate you can use

  session.createSQLQuery("select column as num from table")
 .addScalar("num", Hibernate.LONG).list();
于 2016-07-25T20:21:59.633 回答
4

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

public PostgreSQLDialect() {
        super();
        registerHibernateType(Types.BIGINT, StandardBasicTypes.LONG.getName());
    }
于 2019-01-21T11:06:50.570 回答
3

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

BigInteger是一个特殊的类来保存无限大小的整数值。此外,BigInteger不能隐式地转换为 long 。

为避免此错误,BigInteger应将数据库字段更改为long兼容类型。将其更改为int可以long隐式转换为 int 的类型。请参阅BigInteger

于 2013-09-12T10:42:56.777 回答
1

您可以在此处查看以下链接 以查看 BigInteger 身份生成器类

于 2013-10-14T07:27:36.233 回答