Pregunta

Tengo un pequeño problema al convertir el resultado de una consulta MySQL a una clase Java cuando uso SUM.

Cuando se realiza un SUM simple en MySQL

SELECT SUM(price) FROM cakes WHERE ingredient = 'chocolate';

con price siendo un número entero, parece que SUM a veces devuelve una cadena y otras veces un número entero, dependiendo de la versión del controlador JDBC.

Aparentemente, el servidor le dice al controlador JDBC que el resultado de SUM es una cadena, y el controlador JDBC a veces 'convenientemente' convierte esto en un número entero. (consulte explicación de Marc Matthews ).

El código Java utiliza algunos BeanInfo y Introspección a rellene automáticamente una (lista de) bean (s) con el resultado de una consulta. Pero esto obviamente no puede funcionar si los tipos de datos difieren entre los servidores donde se implementa la aplicación.

No me importa si obtengo una cadena o un entero, pero me gustaría tener siempre el mismo tipo de datos, o al menos saber de antemano qué tipo de datos obtendré.

¿Hay alguna forma de saber qué tipo de datos devolverá un SUM de MySQL desde el código Java? ¿O alguien conoce alguna forma mejor de lidiar con esto?

¿Fue útil?

Solución

Esto es solo una suposición, pero tal vez convertirlo en un número entero obligará a MySQL a decir siempre que es un número entero.

SELECT CAST(SUM(price) AS SIGNED) FROM cakes WHERE ingredient = 'marshmallows';

Otros consejos

Nunca he trabajado con MySQL antes, así que no puedo decir por qué, pero si dices:

ResultSet rs = statement.executeQuery("SELECT SUM(price) FROM cakes WHERE ingredient = 'chocolate'");
int sum = 0;
if(rs.next())
size = Integer.parseInt(rs.getString(1));

Entonces no debería tener ningún problema, independientemente del tipo de datos devuelto como dice la documentación:

  

String getString (int columnIndex) lanza SQLException


Recupera el valor de la columna designada en la fila actual de este objeto ResultSet como String en el lenguaje de programación Java

Encontré COALESCE (SUM (precio), 0) bueno para asegurar siempre que el campo devolviera 0 si no había resultado.

Ver: http://lists.mysql.com/mysql/177427

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top