2010-02-26 16 views
11

Tengo una columna de tipo Fecha en Oracle DB y contiene la fecha y la hora con seguridad. Pero cuando trato de obtener datos en la aplicación Java, devolverá la fecha con un montón de ceros en lugar de en tiempo real. En código será como:Fecha de Java Hora de corte de Hibernate

SQLQuery sqlQuery = session.createSQLQuery("SELECT table.id, table.date FROM table"); 
List<Object[]> resultArray = sqlQuery.list(); 
Date date = (Date)resultArray[1]; 

Si era 26-Feb-2010 17:59:16 en DB voy a conseguir 26-Feb-2010 00:00:00 Cómo conseguirlo ¿con tiempo?

Respuesta

4

No soy un experto con Oracle, pero es probable que necesite un tipo de columna DateTime para obtener un sello de tiempo.

Con eso tiene que usar java.sql.Timestamp tipo JDBC.

+3

En Oracle, el tipo de datos 'date' contiene información de fecha y hora , al igual que 'java.lang.Date'. –

0

Prueba esto:

session.createSQLQuery("SELECT table.id as i, table.date as d FROM table") 
    .addScalar("i", Hibernate.LONG) // Or whatever type id is 
    .addScalar("d", Hibernate.TIMESTAMP); 
+0

Gracias. Ahora funciona. Pero odio el hecho de que debería definir los tipos para todos los parámetros devueltos allí. Tengo bastantes de ellos ... – Vlad

+0

Puedes probar un dialecto personalizado. El dialecto base dice "registrar tipos de hibernación para el uso predeterminado en detección automática de tipo sqlquery escalar" y tiene Types.DATE adaptado a Hibernate.DATE - podría subclasificarlo y hacer coincidir Types.DATE con Hibernate.TIMESTAMP. –

0

tal vez usted tiene this problem? Asegúrate de que tienes la última versión del controlador JDBC, el nombre del archivo debe ser ojdbc5.jar.

3

Tuve el mismo problema (tipo de fecha de Oracle en la base de datos).

La siguiente asignación funciona para mí:

<property name="timeStamp" type="java.util.Date"> 
    <column name="TIME_STAMP"/> 
</property> 
2

que he encontrado este problema en el pasado también. Para resolverlo, cambie la asignación de hibernación de:

<property name="timeStamp" type="java.util.Date"> 
    <column name="TIME_STAMP"/> 
</property> 

a

<property name="timeStamp" type="timestamp"> 
    <column name="TIME_STAMP"/> 
</property> 

Puede dejar el tipo de datos en el objeto Hibernate como java.util.Date.

2

Sí que también funciona bien hibernación 3.3, utilice ojdbc6.jar y en la anotación de cambiar la fecha de marca de tiempo, como a continuación

@Id 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "TDATE", length = 7) 
public Date getTdate() { 
    return this.tdate; 
} 

public void setTdate(Date tdate) { 
    this.tdate = tdate; 
} 
9

Como otros ya han dicho, es necesario utilizar java.sql.Timestamp para obtener el tiempo.

Sin embargo, si utiliza la anotación @Temporal(TemporalType.TIMESTAMP) en la columna DATE de Oracle, Hibernate se quejará y arrojará errores de validación de esquema. Para evitar aquellos, añadir un columnDefinition así:

@Temporal(TemporalType.TIMESTAMP) 
@Column(name="EVENTTIME", columnDefinition="DATE") 
private Date eventTime; 
+2

¡No puedo votar lo suficiente! ¡Esta debería ser la respuesta aceptada! –

0

que fue en el mismo problema recientemente. Aquí está mi enfoque ...

Así que en este caso definen un bucle for en la clase QueryImplementation, de tal manera que comprueba el tipo de todas las columnas de la tabla de base de datos. Si el nombre de la columna es de tipo DATE, agregue addScalar ("columnName", new Timestamptype()) al generador de consultas. De esta forma, las Columnas del tipo de fecha mostrarán la marca de tiempo en la aplicación java.

Por favor, encontrar el código de ejemplo siguiente:

SQLQuery hibernateQuery = getSession().createSQLQuery(sqlQuery); 

     Set<String> columns = columnDataTypes.keySet(); 
    for (String column : columns) { 
     if (columnDataTypes.get(column).equals(SqlType.DATE.name())) { 
      hibernateQuery.addScalar(column, new TimestampType()); 
     } else { 
      hibernateQuery.addScalar(column); 
     } 
    } 

Espero que esto ayude.

Rakesh.

0

Tal vez un poco tarde, pero en mi caso la solución fue simplemente agregar @Temporal (TemporalType.DATE) a mi campo de fecha.

@Temporal(TemporalType.DATE) 
private Date date; 

Y otra solución que encontramos (cuando el primero no funcionaba) fue decirle explícitamente hibernar el Tipo:

@Type(type = "date") 
private Date date; 
Cuestiones relacionadas