Ответ 1
Ваша ошибка может быть в этой строке:
List<Long> result = query.list();
где query.list() возвращает список BigInteger вместо длинного списка. Попробуйте изменить его.
List<BigInteger> result = query.list();
У меня есть List<Long> dynamics
. И я хочу получить максимальный результат с помощью Collections
. Это мой код:
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
. Что не так?
Ваша ошибка может быть в этой строке:
List<Long> result = query.list();
где query.list() возвращает список BigInteger вместо длинного списка. Попробуйте изменить его.
List<BigInteger> result = query.list();
Лучше использовать SQLQuery # addScalar, чем приведение к Long
или BigDecimal
.
Вот измененный запрос, который возвращает столбец count
как 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);
Тогда
List<Long> result = query.list(); //No ClassCastException here
Ссылки по теме
Hibernate.LONG
, помните, что он устарел после версии Hibernate версии 3.6.X LongType.INSTANCE
Мне не хватает контекста, но это работает отлично:
List<BigInteger> nums = new ArrayList<BigInteger>();
Long max = Collections.max(nums).longValue(); // from BigInteger to Long...
Попробуйте преобразовать BigInteger в длинный, как этот
Long longNumber= bigIntegerNumber.longValue();
Вам нужно добавить псевдоним для подсчета к вашему запросу, а затем использовать метод addScalar()
как метод по умолчанию для метода list()
в шлейфах Hibernate для BigInteger
для числовых типов SQL. Вот пример:
List<Long> sqlResult = session.createSQLQuery("SELECT column AS num FROM table")
.addScalar("num", StandardBasicTypes.LONG).list();
Вы уверены, что динамика List<Long>
, а не List<BigInteger>
?
Если динамика равна List<Long>
, вам не нужно делать приведение (Long)
Представьте, что d.getId является длинным, затем заверните вот так:
BigInteger l = BigInteger.valueOf(d.getId());