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

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

クエリ結果をクラス Sender のオブジェクトに手動で変換する必要がありますか (それは残念です)。または、Hibernateが slongの代わりに IDを返すようにすることはできBigIntegerますか? または他のアイデアはありますか?

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

4

5 に答える 5

31

hibernate の ".list()" のデフォルトは、Numeric の BigInteger 戻り値の型のようです。回避策の 1 つを次に示します。

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

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

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

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

于 2013-09-12T10:42:56.777 に答える
1

次のリンク で確認できます BigInteger IDジェネレータークラスについては、こちらを確認してください

于 2013-10-14T07:27:36.233 に答える