web-dev-qa-db-de.com

java.math.BigInteger kann nicht in Java.lang.Long umgewandelt werden

Ich habe List<Long> dynamics. Und ich möchte mit Collections ein maximales Ergebnis erzielen. Das ist mein Code:

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

Dies ist meine 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;

    }

Jetzt bekomme ich Java.math.BigInteger cannot be cast to Java.lang.Long. Was ist falsch?

18
Tony

Ihr Fehler könnte in dieser Zeile liegen:

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

dabei gibt query.list () statt der Long-Liste eine BigInteger-Liste zurück. Versuchen Sie es in zu ändern. 

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

Eine bessere Option ist die Verwendung von SQLQuery # addScalar als das Umwandeln in Long oder BigDecimal

Hier ist eine modifizierte Abfrage, die count als Long zurückgibt. 

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);

Dann 

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

Weiterführender Link 

28
Aniket Kulkarni

Versuchen Sie, den BigInteger in einen Long-Wert wie folgt umzuwandeln

Long longNumber= bigIntegerNumber.longValue();
4
Abstract

Mir fehlt der Kontext, aber das funktioniert gut:

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

Sie müssen der Abfrage einen Alias ​​für die Zählung hinzufügen und dann die addScalar()-Methode als Standard für die list()-Methode in Hibernate-Nähten verwenden, um BigInteger für numerische SQL-Typen zu sein. Hier ist ein Beispiel:

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

Sind Sie sicher, dass Dynamik ein List<Long> und nicht List<BigInteger> ist?

Wenn Dynamik ein List<Long> ist, müssen Sie keinen Cast an (Long) durchführen.

0
dkatzel

Stellen Sie sich vor, dass d.getId ein Long ist und dann wie folgt umgebrochen wird:

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