Los métodos queryforInt / queryforLong en JdbcTemplate están obsoletos en Spring 3.2. No puedo averiguar por qué o qué se considera la mejor práctica para reemplazar el código existente utilizando estos métodos.
Un método típico:
int rowCount = jscoreJdbcTemplate.queryForInt(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
);
OK, el método anterior debe reescribirse de la siguiente manera:
Object[] params = new Object[] {
playerNameKey.toUpperCase(),
teamNameKey.toUpperCase()
};
int rowCount = jscoreJdbcTemplate.queryForObject(
"SELECT count(*) FROM _player WHERE nameKey = ? AND teamClub = ?",
params, Integer.class);
Obviamente, esta desaprobación hace que la clase JdbcTemplate sea más simple (¿o no?). QueryForInt siempre fue un método de conveniencia (supongo) y ha existido durante mucho tiempo. ¿Por qué se ha eliminado? Como resultado, el código se vuelve más complicado.
java
spring
jdbc
jdbctemplate
Dan MacBean
fuente
fuente
@Deprecated
null
(no es el caso en su ejemplo). No encontré otra forma que duplicar ahora el código de verificación nulo de queryForInt / Long.Respuestas:
Lo que creo es que alguien se dio cuenta de que los métodos queryForInt / Long tienen semánticas confusas, es decir, desde el código fuente de JdbcTemplate se puede ver su implementación actual:
lo que puede llevarlo a pensar que si el conjunto de resultados está vacío, devolverá 0, sin embargo, arroja una excepción:
org.springframework.dao.EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0
por lo que la siguiente implementación es esencialmente equivalente a la actual:
Y luego, el código no obsoleto ahora debe reemplazarse con el feo:
o esto (mejor):
fuente
Estoy de acuerdo con el póster original de que desaprobar el método de conveniencia queryForLong (sql) es un inconveniente.
Desarrollé una aplicación con Spring 3.1 y la actualicé a la última versión de Spring (3.2.3) y noté que estaba obsoleta.
Afortunadamente, fue un cambio de una línea para mí:
fue cambiado a
Y un par de pruebas unitarias parecen indicar que el cambio anterior funciona.
fuente
En desuso a favor de
queryForObject(String, Class)
.fuente
Reemplazo de dicho código:
Con este código:
es muy peligroso porque si la columna tiene un valor nulo, queryForObject devuelve un valor nulo y, como sabemos, los tipos primitivos no pueden ser nulos y tendrá NullPointerException. El compilador no le advirtió sobre esto. Sabrá acerca de este error en tiempo de ejecución. El mismo error que tendrá si tiene un método que devuelve el tipo primitivo:
El método obsoleto queryForLong en JdbcTemplate en Spring 3.2.2 tiene el siguiente cuerpo:
Verá, antes de que devuelvan un valor primitivo, hay que verificar que no sea nulo y, si es nulo, devuelvan 0. Por cierto, debería ser 0L.
fuente
JdbcTemplate#queryForInt
devuelve 0 si el valor de la columna es SQL NULL o 0. No hay forma de distinguir un caso del otro. Creo que esta es la razón principal por la que el método está en desuso. Por cierto, seResultSet#getInt
comporta de manera similar. Sin embargo, podemos distinguir entre estos dos casos porResultSet#wasNull
.fuente
fuente