web-dev-qa-db-ja.com

HibernateがlongではなくBigIntegerを返す

これは私の送信者エンティティです

@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がBigInteger(Hibernateによって返される)ではなく実際には長いために発生します。

このような場合のベストプラクティスは何だろうと思っていました。BigIntegersをIDとして使用する必要がありますか(少しやりすぎのようです)。

クエリ結果を手動でクラスSenderのオブジェクトに変換する必要がありますか(それは厄介です)?または、HibernateがlongsではなくBigInteger idを返すようにできますか?または他のアイデア?

Spring、Hibernate 4.1.1、MySQLを使用しています

16

Hibernateの ".list()"のデフォルトは、数値のBigInteger戻り型のようです。これは1つの回避策です。

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

古いバージョンのHibernateでは、

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

#Hedleyコメントに追加してグローバルに修正するには、SQL Dialectコンストラクターに行を追加できます。私のプロジェクトでは次のようでした:

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

オブジェクトデータベースのマッピングが間違っています。ここには、データベースフィールドがBigIntegerであると言う例外がありますが、オブジェクトプロパティはlongです。

BigIntegerは、無制限のサイズの整数値を保持する特別なクラスです。さらに、BigIntegerは暗黙的にlongにキャストできません。

このエラーデータベースフィールドを回避するには、BigIntegerlong互換タイプに変更する必要があります。これをint型に変更します。intは暗黙的にlongにキャストできます。 BigInteger を参照してください。

3
erencan
1
haripcce