Java Hibernate返回大整数而不是长整数

Java Hibernate返回大整数而不是长整数,java,spring,hibernate,long-integer,biginteger,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 senderI

这是我的发送者实体

@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-hh000123:IllegalArgumentException在类中:be.gimme.persistence.entities.Sender,属性的setter方法:senderId

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

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

我想知道在这种情况下最好的做法是什么,我应该使用大整数作为id吗(似乎有点过分)

我是否应该手动将查询结果转换为类Sender的对象(这将是一个小问题)?或者我可以让Hibernate返回
long
id而不是
biginger
s吗?还有其他想法吗


我使用的是Spring、Hibernate 4.1.1和MySQL,对象数据库映射是错误的。这里有一个强制转换异常,表示数据库字段是
biginger
,但对象属性是
long

biginger
是一个特殊类,用于保存大小不限的整数值。此外,
biginger
不能隐式转换为long


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

您可以查看以下链接 hibernate中“.list()”的默认值似乎是数字的BigInteger返回类型。这里有一个解决方法:

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

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

  session.createSQLQuery("select column as num from table")
 .addScalar("num", Hibernate.LONG).list();
添加到#Hedley comment以全局修复它,您可以在SQL方言构造函数中添加一行。 在我的项目中,它就像:

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

数据库中有大整数类型吗?确保对象映射正确。是的,它们都是BIGINT(20)类型。但这些都是Hibernate生成的表,这里有很多不清楚的地方。无论什么原因,您的映射都应该正确地映射到数据库。我排除了隐式装箱、拆箱和铸造问题
Transformers.aliasToBean
如果您有混合名称,则可能会将错误的db字段映射到类对象。@我是否可以将我的发件人实体添加到问题中。但是我不认为长id不应该被映射成BIGINT(20)到MySQL(在MySQL中还有什么类型是正确的?),你能把BIGINT(20)改成int吗?因为BigInteger不能隐式转换为long.Yep,这里的问题是默认的Hibernate行为。您还可以通过在调用registerHibernateType(Types.BIGINT,Hibernate.LONG.getName())中注册一个自定义SQL方言,在全局级别上覆盖它;如果hql查询addScalar不是一个函数,那么应该有什么替代方法请告诉我know@dom不确定,可能将其作为一个新问题搁置,并在此处添加链接:)