Tipo de datos del resultado SUM en MySQL
-
11-07-2019 - |
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?
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.