2013-08-21 12 views
14

Mam List<Long> dynamics. I chcę uzyskać maksymalny wynik przy użyciu Collections. To jest mój kod:java.math.BigInteger nie można przesłać na java.lang.Long

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

To jest mój 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; 

    } 

Teraz dostaję java.math.BigInteger cannot be cast to java.lang.Long. Co jest nie tak?

+3

Powiedziałbym, że próbujesz rzucić 'BigInteger' na' Long'. –

+0

Ponieważ instancja klasy 'java.math.BigInteger' ** nie jest ** instancją klasy' java.lang.Long'. –

+0

Będziesz potrzebować dostarczyć więcej kodu, jeśli potrzebujesz dodatkowej pomocy. Może linia, na którą wskazuje błąd? A jaki typ zwraca getDynamics()? –

Odpowiedz

17

Twój błąd może być w tej linii:

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

gdzie query.list() zwraca listę BigInteger zamiast Long. Spróbuj zmienić to na.

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

Wybieram cię. – Tony

+0

Jako @StormeHawke powiedział "... faktycznie zwraca listę, która zawiera przynajmniej kilka BigIntegers". Więc lepiej się dowiedz, zanim przejdziesz do następnego problemu tego rodzaju. – mike

+1

Ta odpowiedź leży w niewłaściwym założeniu na temat wewnętrznych typów opakowań Hibernate! Jedyna ** odpowiedź Aniket Kulkarni ** SQLQuery # addScalar * ma rację! – gavenkoa

0

Czy jesteś pewien, że dynamika to List<Long>, a nie List<BigInteger>?

Jeśli dynamika jest List<Long> nie trzeba zrobić do obsady (Long)

2

mi brakuje kontekstu, ale to działa dobrze:

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

Słyszałem, że' COUNT (*) ' oświadczenie zwraca 'Long'. Czyż nie? – Tony

2

Spróbuj przekonwertować BigInteger do długo jak ten

Long longNumber= bigIntegerNumber.longValue(); 
26

lepszym rozwiązaniem jest użyć SQLQuery#addScalar niż odlewania do Long lub BigDecimal.

Tutaj jest modyfikowany kwerendę zwracającą count kolumna jako 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); 

Następnie

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

Odnośnik

+1

Jesteś bohaterem! +1, ale naprawdę +100! – gavenkoa

0

Wyobraź d.getId jest długi, a następnie otoczyć w ten sposób:

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

Potrzebujesz ogłoszenia d alias dla liczby do zapytania, a następnie użyj metody addScalar() jako domyślnej dla metody list() w szwach hibernacji, aby uzyskać BigInteger dla liczbowych typów SQL.Oto przykład:

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