2012-03-01 48 views
9

Recibo la siguiente excepción.java.math.BigInteger no se puede convertir a java.lang.Integer

Causado por:

java.lang.ClassCastException: java.math.BigInteger no pueden ser echados a java.lang.Integer

con el siguiente código

List queryResult = query.list(); 

for (Iterator<Object[]> it = queryResult.iterator(); it.hasNext();) { 
    Object[] result = it.next(); 
    Integer childId = (Integer) result[0]; 
    Integer grandChildCount = (Integer) result[1]; 
    CompanyNode childNode = childNodes.get(childId); 
    childNode.setHasChildren(grandChildCount != 0); 
    childNode.setIsLeaf(grandChildCount == 0); 
} 

en esta línea

Integer grandChildCount = (Integer) result[1]; 

¿Alguien tiene alguna idea?

+0

Gracias a todos, lo estoy probando ahora en producción, espero que funcione ahora. –

Respuesta

25

Se puede utilizar:

Integer grandChildCount = ((BigInteger) result[1]).intValue(); 

O tal vez fundido a Number para cubrir tanto Integer y BigInteger valores.

+4

El '.' se une más fuerte que el molde, por lo que' ((BigInteger) result [1]). IntValue() 'sería el preferido, creo. –

+0

@RayToal - Buena captura. –

1

La columna en la base de datos es probablemente DECIMAL. Debe procesarlo como BigInteger, no como Integer, de lo contrario, está perdiendo dígitos. O cambie la columna a int.

8

Como vemos en el Javadoc, BigInteger no es una subclase de Integer:

java.lang.Object      java.lang.Object 
    java.lang.Number      java.lang.Number 
     java.math.BigInteger     java.lang.Integer 

y esa es la razón por la fundición de BigInteger a Integer es imposible.

La fundición de primitivos java hará algunas conversiones (como la fundición de double a int) mientras que la fusión de tipos nunca transformará las clases.

+0

Estaba confundido porque la base de datos local se generaba con un entero por hibernación y lo mismo debería ocurrir con la producción, pero se cambió a un int en producción. –

Cuestiones relacionadas