sqljava。ClassCastException:java。数学无法将BigInteger转换为java。朗朗
我想使用本机sql返回行数。但是控制台说我java.math.BigInteger cannot be cast to java.lang.Long
。
发生了什么?这是我的方法:
public Long getNumRows(Integer id){
Session session = null;
session = this.sessionFactory.getCurrentSession();
Query query = session
.createSQLQuery("SELECT COUNT(*) FROM controllnews WHERE news_id="
+ id + ";");
List firstResult = query.list();
return (Long) firstResult.get(0);
}
# 1 楼答案
我试过这个效果很好
# 2 楼答案
使用^{} 方法,而不是将其强制转换为
Long
:似乎
firstResult.get(0)
返回一个Object
。一个选项是将类型转换为BigInteger
:但不要这样做。而是使用Nambari在评论中提供的方式。我不是Hibernate的用户,所以我不能提供特定于Hibernate的解决方案
# 3 楼答案
我也面临同样的问题,我使用了Hibernate标量查询,正如@Rohit Jain's answer的注释中所建议的那样。谢谢@nambari的评论
说到我们的问题
它们将返回一个对象数组列表(Object[]),其中包含
controllnews
表中每列的标量值。Hibernate将使用ResultSetMetadata来推断返回的标量值的实际顺序和类型为了避免使用ResultSetMetadata的开销,或者只是为了更明确地显示返回的内容,可以使用addScalar():
这将返回对象数组,但现在它将不使用ResultSetMetadata,而是从基础resultset显式获取
count
列作为Long
ResultSetMetaData返回的
java.sql.Types
如何映射到Hibernate类型由方言控制。如果某个特定类型没有映射,或者没有生成预期的类型,可以通过调用方言中的registerHibernateType
对其进行自定义您可以使用Query#setParameter方法避免查询中的任何错误
当您参考Scalar queriesdocs 4.0时,一个困惑是,
addScalar
方法有第二个参数Hibernate.LONG
,请记住,自Hibernate 3.6版以来,它一直被弃用。XHere is the deprecated document,所以必须使用
LongType.INSTANCE
相关链接