Domanda

Sto riscontrando un po 'di problemi con la conversione del risultato di una query MySQL in una classe Java quando si utilizza SUM.

Quando si esegue un SUM semplice in MySQL

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

con price essendo un numero intero, sembra che il SUM talvolta restituisca una stringa e talvolta un numero intero, a seconda della versione del driver JDBC.

Apparentemente il server dice al driver JDBC che il risultato di SUM è una stringa, e il driver JDBC a volte lo converte 'convenientemente in un numero intero. (vedi la spiegazione di Marc Matthews ).

Il codice Java utilizza alcuni BeanInfo e Introspection a compilare automaticamente un (elenco di) bean (s) con il risultato di una query. Ma questo ovviamente non può funzionare se i tipi di dati differiscono tra i server in cui è distribuita l'applicazione.

Non mi interessa se ricevo una stringa o un numero intero, ma mi piacerebbe avere sempre lo stesso tipo di dati, o almeno sapere in anticipo quale tipo di dati avrò.

Esiste un modo per sapere quale tipo di dati verrà restituito da un SUM di MySQL dal codice Java? O qualcuno conosce un modo migliore per affrontarlo?

È stato utile?

Soluzione

Questa è solo un'ipotesi, ma forse il casting in numero intero costringerà MySQL a dire sempre che è un numero intero.

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

Altri suggerimenti

Non ho mai lavorato con MySQL prima, quindi non posso dire il perché, ma se dici:

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

Quindi non dovresti avere problemi a prescindere dal tipo di dati restituito come dice la documentazione:

  

String getString (int columnIndex) genera SQLException


Recupera il valore della colonna designata nella riga corrente di questo oggetto ResultSet come stringa nel linguaggio di programmazione Java

Ho trovato COALESCE (SUM (prezzo), 0) buono per assicurarsi sempre che il campo abbia restituito 0 se non ci sono risultati.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top