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

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

我在 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 cannot be cast to java.lang.Long Exception while executing this step 整数计数 = hibernateQuery.executeUpdate();

该代码有什么问题以及如何摆脱该异常

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

我猜

orderDAO.getOrderIdByUserId(userId) return 是 BigDecimal 的列表,而不是 Long 的列表。没有那个方法的代码很难说。


编辑(现在代码已经存在):考虑到 ,您可以看到一些数据库(想到 Oracle)return BigDecimal(或者 List<BigDecimal>) 在 Hibernate 中调用 list() 时。您的 Java 代码在使用原始 List 时存在错误,并且只是假定某种类型确实是另一种类型。

getOrderIdByUserId() 可以 return List<? extends Number>,这将同时匹配 LongBigDecimal;或者它可以 return List<BigDecimal> 如果这是真的。不使用原始类型!

setParameterList() 允许第三个参数,即列表元素的类型。用那个。

我已将其更新为 hibernateQuery.setBigDecimal("orderIds", orderIds);

,而不是使用 hibernateQuery.setParameterList("orderIds", orderIds);

现在一切正常。