有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);


    }

共 (3) 个答案

  1. # 1 楼答案

      String query ="select count(*) from tablename";       
      Number count = (Number) sessionFactory.getCurrentSession().createSQLQuery(query).uniqueResult();
      Long value = count.longValue();
    

    我试过这个效果很好

  2. # 2 楼答案

    使用^{}方法,而不是将其强制转换为Long

    return firstResult.get(0).longValue();
    

    似乎firstResult.get(0)返回一个Object。一个选项是将类型转换为BigInteger

    return ((BigInteger)firstResult.get(0)).longValue();
    

    但不要这样做。而是使用Nambari在评论中提供的方式。我不是Hibernate的用户,所以我不能提供特定于Hibernate的解决方案

  3. # 3 楼答案

    我也面临同样的问题,我使用了Hibernate标量查询,正如@Rohit Jain's answer的注释中所建议的那样。谢谢@nambari的评论

    说到我们的问题

    Query query = session
                .createSQLQuery("SELECT COUNT(*) FROM controllnews WHERE news_id="
                        + id + ";");  
    

    它们将返回一个对象数组列表(Object[]),其中包含controllnews表中每列的标量值。Hibernate将使用ResultSetMetadata来推断返回的标量值的实际顺序和类型

    为了避免使用ResultSetMetadata的开销,或者只是为了更明确地显示返回的内容,可以使用addScalar():

    Query query = session
                .createSQLQuery("SELECT COUNT(*) as count FROM controllnews WHERE news_id="
                        + id + ";").addScalar("count", LongType.INSTANCE);  
    

    这将返回对象数组,但现在它将不使用ResultSetMetadata,而是从基础resultset显式获取count列作为Long

    ResultSetMetaData返回的java.sql.Types如何映射到Hibernate类型由方言控制。如果某个特定类型没有映射,或者没有生成预期的类型,可以通过调用方言中的registerHibernateType对其进行自定义


    您可以使用Query#setParameter方法避免查询中的任何错误

    Query query = session
               .createSQLQuery("SELECT COUNT(*) as count FROM controllnews WHERE news_id= :id")
               .addScalar("count", LongType.INSTANCE).setParameter("id",id);  
    

    当您参考Scalar queriesdocs 4.0时,一个困惑是,addScalar方法有第二个参数Hibernate.LONG,请记住,自Hibernate 3.6版以来,它一直被弃用。X
    Here is the deprecated document,所以必须使用LongType.INSTANCE

    相关链接