Frage

Ich bin mit der Umwandlung des Ergebnisses einer MySQL-Abfrage zu einer Java-Klasse ein bisschen ein Problem haben, wenn SUM verwendet wird.

Wenn Sie eine einfache Summe in MySQL Ausführen

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

mit price eine ganze Zahl, scheint es, dass die SUM manchmal einen String zurückgibt und manchmal eine ganze Zahl, abhängig von der Version des JDBC-Treibers.

Offenbar führt der Server den JDBC-Treiber sagen, dass das Ergebnis der SUM ein String ist, und der JDBC-Treiber manchmal ‚bequem‘ wandelt diese in eine Ganzzahl. (Siehe Marc Matthews' Erklärung ).

Der Java-Code verwendet einige BeanInfo und Introspection in einer (Liste) Bohne (n) mit dem Ergebnis einer Abfrage automatisch füllen. Aber das kann natürlich nicht funktionieren, wenn die Datentypen zwischen Servern unterscheiden, wo die Anwendung bereitgestellt wird.

ist mir egal, ob ich einen String oder eine ganze Zahl, aber ich möchte immer den gleichen Datentyp haben, oder zumindest im Voraus wissen, welche Datentypen ich bekommen werde.

Gibt es eine Möglichkeit zu wissen, welchen Datentyp wird von einem MySQL SUM aus dem Java-Code zurückgegeben werden? Oder weiß jemand etwas besseren Weg, um damit umzugehen?

War es hilfreich?

Lösung

Das ist nur eine Vermutung, aber vielleicht MySQL auf ganzzahlige Casting zwingen immer zu sagen, es ist eine ganze Zahl.

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

Andere Tipps

Ich habe noch nie mit MySQL gearbeitet, bevor, so kann ich nicht sagen, warum, aber wenn Sie sagen:

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

Dann sollten Sie kein Problem, unabhängig von der zurückDatenTyp haben wie die Dokumentation sagt:

  

String getString (int column) throws SQLException


Ruft den Wert der bezeichneten Spalte in der aktuellen Zeile dieses Objekt ResultSet als String in der Programmiersprache Java

Ich fand COALESCE(SUM(price),0) gut für immer gewährleistet das Feld 0 zurückgegeben, wenn kein Ergebnis.

Siehe auch: http://lists.mysql.com/mysql/177427

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top