2013-08-21 9 views
14

私にはList<Long> dynamicsがあります。そして、私はCollectionsを使って最大の結果を得たいと思っています。これは私のコードです:java.math.BigIntegerはjava.lang.Longにキャストできません

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を取得しています。どうしましたか?

+3

私は 'BigInteger'を' Long'にキャストしようとしています。 –

+0

'java.math.BigInteger'クラスのインスタンス**は' java.lang.Long'クラスのインスタンスではありません。 –

+0

さらなるヘルプが必要な場合は、より多くのコードを提供する必要があります。多分エラーが指している行ですか? getDynamics()はどんな型を返しますか? –

答えて

17

あなたの誤差があるかもしれません

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

ここで、query.list()はLongリストの代わりにBigIntegerリストを返します。それをに変更してみてください。

List<BigInteger> result = query.list(); 
+0

私はあなたを選ぶでしょう。 – Tony

+0

@StormeHawkeが言ったように、「少なくともBigIntegerを含んでいるListを実際に返しています。だから、あなたはこの種の次の問題にぶつかる前に、正確に見つけ出すほうがよいでしょう。 – mike

+1

この答えは、内部のHibernateラッパータイプについての間違った前提にあります!唯一の** Aniket Kulkarni **の回答* SQLQuery#addScalar *が正しいです! – gavenkoa

0

ダイナミクスはList<Long>で、List<BigInteger>ではありませんか?

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

2

私は文脈を欠いているんだけど、これはうまく働いている:

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

'COUNT(*)'文は 'Long'を返します。それじゃない? – Tony

2

てみてください、この

Long longNumber= bigIntegerNumber.longValue(); 
26

より良いオプションのように長いへのBigIntegerを変換するLongまたはBigDecimalにキャストよりもSQLQuery#addScalarを使用しています。ここ

countカラムそして

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 

Longなどの関連リンクを返すクエリを変更され

+1

あなたは英雄です! +1、しかし実際には+100! – gavenkoa

0

を使用する必要がありますので、それは、Hibernateのバージョン3.6.x
here is the deprecated document以降廃止されていを覚えています次のようにラップしてください:

BigInteger l = BigInteger.valueOf(d.getId()); 
1

広告が必要ですdをクエリのエイリアスに変換してから、addScalar()メソッドを、数値SQLタイプの場合はBigIntegerになるように、Hibernateの継ぎ目でlist()メソッドのデフォルトとして使用します。ここに例があります:

List<Long> sqlResult = session.createSQLQuery("SELECT column AS num FROM table") 
    .addScalar("num", StandardBasicTypes.LONG).list(); 
関連する問題