Os métodos queryforInt / queryforLong em JdbcTemplate estão obsoletos no Spring 3.2. Não consigo descobrir por que ou o que é considerado a prática recomendada para substituir o código existente usando esses métodos.
Um método típico:
int rowCount = jscoreJdbcTemplate.queryForInt(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
);
OK, o método acima precisa ser reescrito da seguinte forma:
Object[] params = new Object[] {
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
};
int rowCount = jscoreJdbcTemplate.queryForObject(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
params, Integer.class);
Obviamente, essa depreciação torna a classe JdbcTemplate mais simples (ou torna?). QueryForInt sempre foi um método de conveniência (eu acho) e já existe há muito tempo. Por que foi removido. O código se torna mais complicado como resultado.
java
spring
jdbc
jdbctemplate
Dan MacBean
fonte
fonte
@Deprecated
null
(não é o caso em seu exemplo). Não encontrei outra maneira senão duplicar agora o código de verificação nulo de queryForInt / Long.Respostas:
O que eu acho é que alguém percebeu que os métodos queryForInt / Long têm semântica confusa, ou seja, a partir do código-fonte JdbcTemplate você pode ver sua implementação atual:
o que pode levar você a pensar que, se o conjunto de resultados estiver vazio, ele retornará 0, mas lança uma exceção:
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
portanto, a implementação a seguir é essencialmente equivalente à atual:
E então o código não obsoleto agora deve ser substituído pelo feio:
ou este (melhor):
fonte
Concordo com o autor da postagem original que descontinuar o método de conveniência queryForLong (sql) é um inconveniente.
Eu tinha desenvolvido um aplicativo usando Spring 3.1 e acabei de atualizar para a versão mais recente do Spring (3.2.3) e percebi que estava obsoleto.
Felizmente, foi uma mudança de linha para mim:
foi alterado para
E alguns testes de unidade parecem indicar que a mudança acima funciona.
fonte
Obsoleto em favor de
queryForObject(String, Class)
.fonte
Substituindo esse código:
Com este código:
é muito perigoso porque se a coluna tiver valor nulo, queryForObject retornará nulo e, como sabemos, os tipos primitivos não podem ser nulos e você terá NullPointerException. O compilador não avisou sobre isso. Você saberá sobre esse erro em tempo de execução. O mesmo erro que você terá se tiver um método que retorne o tipo primitivo:
O método obsoleto queryForLong em JdbcTemplate no Spring 3.2.2 tem o seguinte corpo:
Veja, antes de eles retornarem o valor primitivo, verifique se não é nulo e se for nulo, eles retornam 0. A propósito - deve ser 0L.
fonte
JdbcTemplate#queryForInt
retorna 0 se o valor da coluna for SQL NULL ou 0. Não há como distinguir um caso do outro. Acho que essa é a principal razão pela qual o método está obsoleto. BTW,ResultSet#getInt
se comporta de forma semelhante. Porém, podemos distinguir entre esses dois casos porResultSet#wasNull
.fonte
fonte