web-dev-qa-db-fra.com

java.math.BigInteger ne peut pas être converti en Java.lang.Long

J'ai List<Long> dynamics. Et je veux obtenir le résultat maximum en utilisant Collections. Ceci est mon code:

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

C'est ma 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;

    }

Maintenant, je reçois Java.math.BigInteger cannot be cast to Java.lang.Long. Qu'est-ce qui ne va pas?

18
Tony

Votre erreur peut être dans cette ligne:

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

où query.list () renvoie une liste BigInteger au lieu d'une liste longue. Essayez de le changer en. 

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

La meilleure option est d’utiliser SQLQuery # addScalar que de transtyper en Long ou BigDecimal

Voici une requête modifiée qui renvoie la colonne count sous la forme 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);

Ensuite 

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

Lien associé 

28
Aniket Kulkarni

Essayez de convertir le BigInteger en un long comme celui-ci

Long longNumber= bigIntegerNumber.longValue();
4
Abstract

Je manque de contexte, mais cela fonctionne très bien:

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

Vous devez ajouter un alias pour le nombre à votre requête, puis utiliser la méthode addScalar() comme méthode par défaut pour la méthode list() dans les coutures Hibernate afin qu'elle soit BigInteger pour les types numériques SQL. Voici un exemple:

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

Etes-vous sûr que la dynamique est un List<Long> et non pas List<BigInteger>?

Si dynamic est un List<Long>, vous n'avez pas besoin de transtyper vers (Long)

0
dkatzel

Imaginez que d.getId soit un long, puis enveloppez comme ceci:

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