Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Long

I have this block of code in OrderService.java

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

This is the code in 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;
     }    

I'm getting an java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Long Exception while executing this step int count = hibernateQuery.executeUpdate();

What's wrong with that code and how to get rid of that exception

like image 481
Karthik Avatar asked Dec 06 '25 08:12

Karthik


2 Answers

To get the long value of a BigDecimal object you can call the .longValue() method on it.

like image 70
rambis Avatar answered Dec 08 '25 20:12

rambis


orderDAO.getOrderIdByUserId(userId) returns a list of BigDecimal, not of Long, I would guess. It’s hard to tell without the code for that method.


EDIT (now that the code is there): Considering https://stackoverflow.com/a/5380867/1506009, you can see that some databases (Oracle comes to mind) return BigDecimal (or rather List<BigDecimal>) when calling list() in Hibernate. Your Java code is faulty in using a raw List and just assuming some type when it is indeed another.

getOrderIdByUserId() could return List<? extends Number>, which would match both Long and BigDecimal; or it could return List<BigDecimal> if that’s the truth. To not use raw types!

setParameterList() allows a third parameter, the type of the list elements. Use that.

like image 25
Michael Piefel Avatar answered Dec 08 '25 22:12

Michael Piefel