Методы queryforInt / queryforLong в JdbcTemplate устарели в Spring 3.2. Я не могу понять, почему или что считается лучшей практикой для замены существующего кода с помощью этих методов.
Типичный метод:
int rowCount = jscoreJdbcTemplate.queryForInt(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
);
ОК, приведенный выше метод необходимо переписать следующим образом:
Object[] params = new Object[] {
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
};
int rowCount = jscoreJdbcTemplate.queryForObject(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
params, Integer.class);
Очевидно, что это устаревание упрощает класс JdbcTemplate (или делает?). QueryForInt всегда был удобным методом (я думаю) и существует уже давно. Почему его удалили. В результате код становится более сложным.
java
spring
jdbc
jdbctemplate
Дэн МакБин
источник
источник
@Deprecated
null
(не в вашем примере). Я не нашел другого способа, кроме как продублировать код нулевой проверки из queryForInt / Long.Ответы:
Я думаю, что кто-то понял, что методы queryForInt / Long имеют запутанную семантику, то есть из исходного кода JdbcTemplate вы можете увидеть его текущую реализацию:
что может привести вас к мысли, что если набор результатов пуст, он вернет 0, однако выдает исключение:
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
так что следующая реализация по существу эквивалентна текущей:
И тогда не устаревший код теперь нужно заменить уродливым:
или это (лучше):
источник
Я согласен с исходным постером, что отказ от удобного метода queryForLong (sql) является неудобством.
Я разработал приложение с использованием Spring 3.1 и только что обновил его до последней версии Spring (3.2.3) и заметил, что оно устарело.
К счастью, для меня это было изменение одной строчки:
был изменен на
И пара модульных тестов, похоже, указывает на то, что вышеуказанное изменение работает.
источник
Устарело в пользу
queryForObject(String, Class)
.источник
Замена такого кода:
С этим кодом:
очень опасно, потому что если столбец имеет нулевое значение, queryForObject возвращает null, и, как мы знаем, примитивные типы не могут быть нулевыми, и у вас будет NullPointerException. Компилятор Вас об этом не предупреждал. Вы узнаете об этой ошибке во время выполнения. Та же ошибка, что и у вас, если у вас есть метод, возвращающий примитивный тип:
Устаревший метод queryForLong в JdbcTemplate в Spring 3.2.2 имеет следующее тело:
Видите ли, прежде чем они вернут примитивное значение, проверяется, не является ли оно нулевым, и если оно равно нулю, они возвращают 0. Между прочим - должно быть 0L.
источник
JdbcTemplate#queryForInt
возвращает 0, если значение столбца - SQL NULL или 0. Невозможно отличить один регистр от другого. Я думаю, что это основная причина, по которой метод устарел. Кстати,ResultSet#getInt
ведет себя аналогично. Хотя мы можем различить эти два случая поResultSet#wasNull
.источник
источник