java.lang.ClassCastException:无法将java.math.BigDecimal强制转换为java.lang.Long

时间:2019-10-03 18:09:46

标签: java hibernate hql

我在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 :(得分:0)

要获取BigDecimal对象的long值,可以在其上调用.longValue()方法。

答案 1 :(得分:0)

我猜想,

orderDAO.getOrderIdByUserId(userId)返回BigDecimal而不是Long的列表。没有该方法的代码很难说。


编辑(现在有代码了):考虑到https://stackoverflow.com/a/5380867/1506009,您可以看到某些数据库(Oracle想到了)在调用{时返回BigDecimal(或更确切地说是List<BigDecimal>) {1}}在休眠状态。您的Java代码在使用原始list()并在确实是其他类型时仅假设某种类型是错误的。

List可以返回getOrderIdByUserId(),它与List<? extends Number>Long都匹配;否则,它可能会返回BigDecimal。不使用原始类型!

List<BigDecimal>允许第三个参数,即列表元素的类型。使用它。

答案 2 :(得分:-1)

我没有使用hibernateQuery.setParameterList("orderIds", orderIds);,而是将其更新为hibernateQuery.setBigDecimal("orderIds", orderIds);

现在一切正常。

相关问题