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?
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();
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é
Hibernate.LONG
, rappelez-vous il est obsolète depuis Hibernate version 3.6.XLongType.INSTANCE
Essayez de convertir le BigInteger en un long comme celui-ci
Long longNumber= bigIntegerNumber.longValue();
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...
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();
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)
Imaginez que d.getId soit un long, puis enveloppez comme ceci:
BigInteger l = BigInteger.valueOf(d.getId());