java.lang.ClassCastException: java.math.BigDecimal нельзя преобразовать в java.lang.Long - PullRequest
0 голосов
/ 03 октября 2019

У меня есть этот блок кода в OrderService.java

    public void deleteOrderByUserId(int userId){
       List<Long> orderIds = orderDAO.getOrderIdByUserId(userId);
       int deleteOrders = orderDAO.deleteOrders(orderIds);
    }

Это код в orderDAO.java

public List getOrderIdByUserId(int userId) {
    StringBuilder queryStr = new StringBuilder("select distinct u.OrderId from ");
    queryStr.append("User u where ");
    queryStr.append("u.UserId in (:key)");

    return getHibernateTemplate().getSessionFactory()
            .getCurrentSession().createSQLQuery(queryStr.toString())
            .setParameter("key", userId).list();
}


    public int deleteOrders(List<Long> orderIds){
      final String deleteOrder = "delete from Order o where o.OrderId in (:orderIds)";
      final Query hibernateQuery = getHibernateTemplate().getSessionFactory().getCurrentSession().createQuery(deleteOrder);
      hibernateQuery.setParameterList("orderIds", orderIds);
      int count = hibernateQuery.executeUpdate();   
      return count;
     }    

Я получаю java.lang.ClassCastException: java.math.BigDecimal нельзя преобразовать в java.lang.Long Исключение при выполнении этого шага int count = hibernateQuery.executeUpdate ();

Что с этим не таккод и как избавиться от этого исключения

Ответы [ 3 ]

0 голосов
/ 03 октября 2019

orderDAO.getOrderIdByUserId(userId) возвращает список BigDecimal, а не Long, я бы предположил. Трудно сказать без кода для этого метода.


РЕДАКТИРОВАТЬ (теперь, когда код существует): Учитывая https://stackoverflow.com/a/5380867/1506009,, вы можете видеть, что некоторые базы данных (на ум приходит Oracle) возвращаютBigDecimal (точнее List<BigDecimal>) при вызове list() в Hibernate. Ваш Java-код некорректен при использовании необработанного List и просто допускает некоторый тип, когда он действительно другой.

getOrderIdByUserId() может вернуть List<? extends Number>, что соответствует как Long, так и BigDecimal;или он может вернуть List<BigDecimal>, если это правда. Чтобы не использовать необработанные типы!

setParameterList() допускает третий параметр, тип элементов списка. Используйте это.

0 голосов
/ 04 октября 2019

Вместо использования hibernateQuery.setParameterList("orderIds", orderIds); я обновил его до hibernateQuery.setBigDecimal("orderIds", orderIds);

Теперь он работает нормально.

0 голосов
/ 03 октября 2019

Чтобы получить длинное значение объекта BigDecimal, вы можете вызвать для него метод .longValue ().

...