Entiende el código de forma correcta previamente a aplicarlo a tu trabajo si tquieres aportar algo puedes decirlo en los comentarios.
Solución:
La mayoría de los proveedores de bases de datos aún no admiten JDBC 4.2. Esta especificación dice que el nuevo java.time
-tipos como LocalDate
será/debería ser apoyado utilizando los métodos existentes setObject(...)
y getObject()
. No se requiere ni se ofrece ninguna conversión explícita (sin cambio de API).
Una solución para el soporte que falta puede ser la conversión manual como se describe en la lista de correo de Derby.
Algo como:
LocalDate birthDate = resultSet.getDate("birth_date").toLocalDate();
Como puede ver, estas conversiones utilizan los tipos no obsoletos java.sql.Date
etc., véase también el javadoc.
Nuevos métodos activados Timestamp
Java 8 incluye nuevos métodos en el java.sql.Timestamp
clase para convertir hacia y desde objetos java.time. Estos métodos de conveniencia son una medida provisional hasta que los controladores JDBC puedan actualizarse para los nuevos tipos de datos.
toInstant
toLocalDateTime
valueOf
from
ídem para Date
& Time
El java.sql.Date
y java.sql.Time
Las clases también tienen métodos de conversión java.time similares agregados en Java 8.
Hoy en día, la mayoría de nosotros usamos controladores compatibles con JDBC 4.2, lo que mejora bastante la situación en comparación con las respuestas de 2015.
Conseguir un LocalDate
de su conjunto de resultados:
LocalDate dateFromDatabase = yourResultSet.getObject(yourColumnIndex, LocalDate.class);
o
LocalDate dateFromDatabase = yourResultSet.getObject("yourColumnLabel", LocalDate.class);
No se ha añadido ningún método nuevo a ResultSet
para que esto funcione. El getObject
El método estuvo ahí todo el tiempo. Lo nuevo es que desde JDBC 4.2 acepta LocalDate.class
como segundo argumento y devuelve un LocalDate
. Lo anterior funciona cuando la consulta devuelve una columna con tipo de datos SQL date
(realmente el tipo JDBC cuenta, pero tienden a estar de acuerdo).
También puede pasar clases de otros tipos de java.time. Y recuperar el tipo correspondiente. Por ejemplo:
OffsetDateTime dateTimeFromDatabase
= yourResultSet.getObject(yourTimestampWithTimeZoneColumnIndex, OffsetDateTime.class);
Los tipos de java.time a utilizar son:
SQL datatype | java.time type
------------------------+-----------------------------------------------------------
date | LocalDate
time | LocalTime
timestamp | LocalDateTime
timestamp with timezone | Officially OffsetDateTime; many drivers accept Instant too
time with timezone | OffsetTime
Para pasar al revés, de Java a su base de datos (para usar como parámetros de consulta o para almacenar) PreparedStatement.setObject
ahora también acepta objetos de los tipos java.time anteriores. Dado que está pasando un objeto de un tipo, no hay necesidad de un parámetro de tipo separado cuando se va de esta manera.
Reseñas y puntuaciones
Si conservas algún reparo o forma de refinar nuestro escrito puedes dejar un paráfrasis y con gusto lo ojearemos.