Type de données du résultat SUM dans MySQL
-
11-07-2019 - |
Question
J'ai un problème avec la conversion du résultat d'une requête MySQL en classe Java lorsque j'utilise SUM.
Lors de l'exécution d'un simple sommaire dans MySQL
SELECT SUM(price) FROM cakes WHERE ingredient = 'chocolate';
avec price
étant un entier, il apparaît que le SUM
renvoie parfois une chaîne et parfois un entier, en fonction de la version du pilote JDBC.
Apparemment, le serveur indique au pilote JDBC que le résultat de SUM
est une chaîne et que le pilote JDBC convertit parfois "commodément" cela en un entier. (voir l'explication de Marc Matthews ).
Le code Java utilise certains BeanInfo et Introspection à remplir automatiquement une (liste de) beans avec le résultat d'une requête. Mais cela ne peut évidemment pas fonctionner si les types de données diffèrent entre les serveurs sur lesquels l’application est déployée.
Peu importe que je reçoive une chaîne ou un entier, mais j'aimerais toujours avoir le même type de données, ou du moins savoir à l'avance quel type de données je vais recevoir.
Existe-t-il un moyen de savoir quel type de données sera renvoyé par un SUM
MySQL à partir du code Java? Ou est-ce que quelqu'un connaît un meilleur moyen de gérer cela?
La solution
Ceci est juste une hypothèse, mais peut-être que transtyper en entier forcera MySQL à toujours dire qu'il s'agit d'un entier.
SELECT CAST(SUM(price) AS SIGNED) FROM cakes WHERE ingredient = 'marshmallows';
Autres conseils
Je n'ai jamais travaillé avec MySQL auparavant, je ne peux donc pas dire pourquoi, mais si vous dites:
ResultSet rs = statement.executeQuery("SELECT SUM(price) FROM cakes WHERE ingredient = 'chocolate'");
int sum = 0;
if(rs.next())
size = Integer.parseInt(rs.getString(1));
Dans ce cas, vous ne devriez pas avoir de problème, quel que soit le type de données renvoyé, car la documentation indique:
String getString (int columnIndex) lève SQLException
Récupère la valeur de la colonne désignée dans la ligne actuelle de cet objet ResultSet en tant que chaîne . dans le langage de programmation Java
J'ai trouvé que COALESCE (SUM (price), 0)
était utile pour garantir que le champ renvoyait 0 s'il n'y avait aucun résultat.