Тип данных результата SUM в MySQL - PullRequest
3 голосов
/ 27 ноября 2008

У меня возникла небольшая проблема с преобразованием результата запроса MySQL в класс Java при использовании SUM.

При выполнении простого SUM в MySQL

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

с price, являющимся целым числом, кажется, что SUM иногда возвращает строку, а иногда и целое число, в зависимости от версии драйвера JDBC.

Судя по всему, сервер сообщает драйверу JDBC, что результатом SUM является строка, и драйвер JDBC иногда «удобно» преобразует это в целое число. (см. объяснение Марка Мэтьюса ).

Java-код использует некоторые BeanInfo и Introspection для автоматического заполнения (списка) bean-компонента (ов) результатом запроса. Но это, очевидно, не может работать, если типы данных различаются между серверами, на которых развернуто приложение.

Мне все равно, получаю ли я строку или целое число, но я бы хотел всегда иметь один и тот же тип данных или, по крайней мере, заранее знать, какой тип данных я получу.

Есть ли какой-нибудь способ узнать, какой тип данных будет возвращен MySQL SUM из кода Java? Или кто-нибудь знает лучший способ справиться с этим?

Ответы [ 3 ]

10 голосов
/ 27 ноября 2008

Это всего лишь предположение, но, возможно, приведение к целому числу заставит MySQL всегда сказать, что это целое число.

SELECT CAST(SUM(price) AS SIGNED) FROM cakes WHERE ingredient = 'marshmallows';
2 голосов
/ 27 ноября 2008

Я никогда раньше не работал с MySQL, поэтому не могу сказать почему, но если вы скажете:

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

Тогда у вас не должно возникнуть проблем независимо от возвращаемого типа данных, как указано в документации:

String getString (int columnIndex) throws SQLException


Извлекает значение указанного столбца в текущей строке этого объекта ResultSet как String на языке программирования Java
0 голосов
/ 28 октября 2009

Я нашел COALESCE(SUM(price),0) хорошо для того, чтобы убедиться, что поле вернуло 0, если результата не было.

См .: http://lists.mysql.com/mysql/177427

...