これは私の送信者エンティティです
@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がlong
sではなくBigInteger
idを返すようにできますか?または他のアイデア?
Spring、Hibernate 4.1.1、MySQLを使用しています
Hibernateの ".list()"のデフォルトは、数値のBigInteger戻り型のようです。これは1つの回避策です。
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コメントに追加してグローバルに修正するには、SQL Dialectコンストラクターに行を追加できます。私のプロジェクトでは次のようでした:
public PostgreSQLDialect() {
super();
registerHibernateType(Types.BIGINT, StandardBasicTypes.LONG.getName());
}
オブジェクトデータベースのマッピングが間違っています。ここには、データベースフィールドがBigInteger
であると言う例外がありますが、オブジェクトプロパティはlong
です。
BigInteger
は、無制限のサイズの整数値を保持する特別なクラスです。さらに、BigInteger
は暗黙的にlongにキャストできません。
このエラーデータベースフィールドを回避するには、BigInteger
をlong
互換タイプに変更する必要があります。これをint
型に変更します。intは暗黙的にlong
にキャストできます。 BigInteger を参照してください。
次のリンクで確認できます BigInteger IDジェネレータークラスについてはこちらを確認してください