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>
,这将同时匹配 Long
和 BigDecimal
;或者它可以 return List<BigDecimal>
如果这是真的。不使用原始类型!
setParameterList()
允许第三个参数,即列表元素的类型。用那个。
我已将其更新为 hibernateQuery.setBigDecimal("orderIds", orderIds);
,而不是使用 hibernateQuery.setParameterList("orderIds", orderIds);
现在一切正常。
我在 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>
,这将同时匹配 Long
和 BigDecimal
;或者它可以 return List<BigDecimal>
如果这是真的。不使用原始类型!
setParameterList()
允许第三个参数,即列表元素的类型。用那个。
我已将其更新为 hibernateQuery.setBigDecimal("orderIds", orderIds);
hibernateQuery.setParameterList("orderIds", orderIds);
现在一切正常。