Тип данных результата SUM в MySQL
-
11-07-2019 - |
Вопрос
У меня возникла небольшая проблема с преобразованием результата запроса 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 . р>