【问题标题】:Hibernate returns BigIntegers instead of longsHibernate 返回 BigIntegers 而不是 longs
【发布时间】:2013-09-12 07:42:18
【问题描述】:

这是我的发件人实体

@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 返回long id 而不是BigIntegers?还是有其他想法?

我正在使用 Spring、Hibernate 4.1.1 和 MySQL

【问题讨论】:

  • 你的数据库中有大整数类型吗?确保您的对象映射正确。
  • 是的,它们都是 BIGINT(20) 类型。但这些是 Hibernate 生成的表。
  • 这里有很多不清楚的地方。无论原因是什么,您的映射都应该正确地映射到数据库。我排除了隐式装箱、拆箱和铸造问题。如果您有混合名称,Transformers.aliasToBean 可能会将错误的 db 字段映射到类对象。
  • @erencan 我已将我的发件人实体添加到问题中。但我不认为长 id 不应该映射 BIGINT(20) 到 MySQL(在 MySQL 中还有什么其他类型是正确的?)。
  • 你能把 BIGINT(20) 改成 int 吗?因为 BigInteger 不能隐式转换为 long。

标签: java spring hibernate long-integer biginteger


【解决方案1】:

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

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

【讨论】:

  • 是的,默认的 Hibernate 行为是这里的问题。您还可以通过调用 registerHibernateType(Types.BIGINT, Hibernate.LONG.getName()); 注册自定义 SQL 方言,在全局级别覆盖它。在构造函数中。
  • 如果 hql 查询 addScalar 不是一个函数,那么应该是什么替代方案请告诉我
  • @dom 不确定,也许将其作为一个新问题并在此处添加链接:)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        【讨论】:

          猜你喜欢
          • 2019-01-20
          • 1970-01-01
          • 1970-01-01
          • 2020-07-13
          • 2016-03-05
          • 2023-04-11
          • 1970-01-01
          • 2021-04-20
          • 2012-03-20
          相关资源
          最近更新 更多