web-dev-qa-db-ja.com

java.math.BigIntegerはJava.lang.Longにキャストできません

私が持っている List<Long> dynamics。そして、Collectionsを使用して最大の結果を取得します。これは私のコードです:

List<Long> dynamics=spyPathService.getDynamics();
        Long max=((Long)Collections.max(dynamics)).longValue(); 

これは私のgetDynamicsです:

public List<Long> getDynamics() {

        Session session = null;

        session = this.sessionFactory.getCurrentSession();
        Query query = session
                .createSQLQuery("SELECT COUNT(*) FROM SpyPath WHERE DATE(time)>=DATE_SUB(CURDATE(),INTERVAL 6 DAY) GROUP BY DATE(time) ORDER BY time;");

        List<Long> result = query.list();
        return result;

    }

今、私はJava.math.BigInteger cannot be cast to Java.lang.Long。どうしましたか?

21
Tony

エラーは次の行にある可能性があります。

List<Long> result = query.list();

query.list()は、長いリストではなくBigIntegerリストを返します。に変更してみてください。

List<BigInteger> result = query.list();
21
Amin Abu-Taleb

より良いオプションは、LongまたはBigDecimalにキャストするよりも SQLQuery#addScalar を使用することです。

count列をLongとして返す変更されたクエリを次に示します。

Query query = session
             .createSQLQuery("SELECT COUNT(*) as count
                             FROM SpyPath 
                             WHERE DATE(time)>=DATE_SUB(CURDATE(),INTERVAL 6 DAY) 
                             GROUP BY DATE(time) 
                             ORDER BY time;")
             .addScalar("count", LongType.INSTANCE);

それから

List<Long> result = query.list(); //No ClassCastException here  

関連リンク

29
Aniket Kulkarni

BigIntegerをこのようなlongに変換してみてください

Long longNumber= bigIntegerNumber.longValue();
5
Abstract

私は文脈に欠けていますが、これはうまく機能しています:

List<BigInteger> nums = new ArrayList<BigInteger>();
Long max = Collections.max(nums).longValue(); // from BigInteger to Long...
2
mike

カウントのエイリアスをクエリに追加し、Hibernateの縫い目のaddScalar()メソッドのデフォルトとしてlist()メソッドを使用して、数値SQLのBigIntegerにする必要があります。タイプ。以下に例を示します。

List<Long> sqlResult = session.createSQLQuery("SELECT column AS num FROM table")
    .addScalar("num", StandardBasicTypes.LONG).list();
1
DevNG

ダイナミクスはList<Long>ではなくList<BigInteger>ですか?

ダイナミクスがList<Long>である場合、(Long)へのキャストを行う必要はありません

0
dkatzel

D.getIdがLongであると想像してから、次のようにラップします。

BigInteger l  = BigInteger.valueOf(d.getId());
0
Bert Verhees