Вопрос

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

Я никогда раньше не работал с 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) выбрасывает SQLException


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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top