java.lang.ClassCastException: java.math.BigInteger no se puede convertir a java.lang.Long

Quiero devolver el número de filas usando sql nativo. Pero la console me dice que java.math.BigInteger cannot be cast to java.lang.Long . ¿Qué pasa? Este es mi método:

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

Use BigInteger#longValue() método BigInteger#longValue() , en lugar de convertirlo a Long :

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

Parece que firstResult.get(0) devuelve un Object . Una opción es encasillar a BigInteger :

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

Pero no hagas esto En su lugar, usa la forma provista por Nambari en los comentarios. No soy usuario de Hibernate, por lo que no puedo proporcionar la solución específica de Hibernate.

Enfrenté el mismo problema, utilicé las consultas de Hibernate Scalar como se sugiere en el comentario de la respuesta de @Rohit Jain . Gracias @nambari por sus comentarios.

Llegando al problema que tenemos,

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

Estos devolverán una list de matrices de objects (Object []) con valores escalares para cada columna en la tabla controllnews . Hibernate usará ResultSetMetadata para deducir el order real y los types de los valores escalares devueltos.

Para evitar la sobrecarga de usar ResultSetMetadata, o simplemente para ser más explícito en lo que se devuelve, se puede usar addScalar ():

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

Esto devolverá las matrices de objects, pero ahora no usará ResultSetMetadata, sino que obtendrá explícitamente la columna de count como Long del set de resultados subyacente.

Cómo se asignan los types java.sql.Types devueltos desde ResultSetMetaData a los types Hibernate está controlado por el dialecto. Si un tipo específico no está correlacionado, o no da como resultado el tipo esperado, es posible personalizarlo mediante llamadas para registerHibernateType en el dialecto.


Puede usar el método Query # setParameter para evitar cualquier error en la consulta como

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

Una confusión cuando refiere las consultas Scalar a los documentos 4.0, el método addScalar tiene el segundo parámetro, Hibernate.LONG , recuerde que ha quedado obsoleto desde la versión 3.6.X de Hibernate.
Aquí está el documento en desuso , por lo que debe usar LongType.INSTANCE

Enlace relacionado

  • Hibernate javadocs