[英]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);
}
这是顺序DAO.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();
该代码有什么问题以及如何摆脱该异常
要获取 BigDecimal object 的长值,您可以对其调用 .longValue() 方法。
我猜orderDAO.getOrderIdByUserId(userId)
返回BigDecimal
的列表,而不是Long
的列表。 如果没有该方法的代码,很难判断。
编辑(现在代码已经存在):考虑到https://stackoverflow.com/a/5380867/1506009 ,您可以看到某些数据库(想到 Oracle)在调用list()
时返回BigDecimal
(或者更确切地说List<BigDecimal>
) list()
在 Hibernate 中。 您的 Java 代码在使用原始List
时存在错误,并且在确实是另一种类型时只是假设某种类型。
getOrderIdByUserId()
可以返回List<? extends Number>
List<? extends Number>
,它将匹配Long
和BigDecimal
; 或者如果这是真的,它可以返回List<BigDecimal>
。 不使用原始类型!
setParameterList()
允许第三个参数,列表元素的类型。 用那个。
而不是使用hibernateQuery.setParameterList("orderIds", orderIds);
,我已将其更新为hibernateQuery.setBigDecimal("orderIds", orderIds);
现在它工作正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.