2010-02-26 4 views
11

Ich habe eine Date-Typ-Spalte in Oracle DB und es enthält Datum und Uhrzeit sicher. Aber wenn ich versuche, Daten in der Java-Anwendung zu erhalten, wird das Datum mit einem Bündel von Nullen anstelle von Echtzeit zurückgegeben. es wird im Code wie:Java Date Ruhezeit

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

Wenn es 26-feb-2010 17.59.16 in DB I 26-feb-2010 00.00.00 bekommen Wie es zu bekommen mit der Zeit?

Antwort

4

Ich bin kein Experte mit Oracle, aber Sie benötigen wahrscheinlich einen DateTime Spaltentyp, um einen Zeitstempel zu erhalten.

Mit diesem müssen Sie java.sql.Timestamp JDBC-Typ verwenden.

+3

In Oracle, die 'DATE' Datentyp enthält sowohl Datums- und Zeitinformationen , ähnlich wie 'java.lang.Date'. –

0

Try this:

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

Danke. Jetzt funktioniert es. Aber ich hasse die Tatsache, dass ich Typen für alle zurückgegebenen Parameter dort definieren sollte. Ich habe eine ganze Menge von ihnen ... – Vlad

+0

Sie könnten einen benutzerdefinierten Dialekt versuchen. Der Basisdialekt sagt "register hibernate types für die Standardverwendung in der automatischen Erkennung vom Typ scalar sqlquery type" und hat Types.DATE mit Hibernate.DATE abgeglichen - Sie könnten ihn ableiten und Types.DATE in Hibernate.TIMESTAMP abgleichen. –

0

Vielleicht haben Sie this problem? Stellen Sie sicher, die neuesten JDBC-Treiber haben, sollte der Dateiname ojdbc5.jar sein.

3

Ich hatte das gleiche Problem (Oracle Date-Typ in der Datenbank).

Die folgende Abbildung funktioniert für mich:

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

ich dieses Problem in der Vergangenheit auch begegnet sind. So beheben Sie es, ändern Sie Ihre Hibernate Mapping aus:

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

zu

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

Sie können den Datentyp in Ihrem Hibernate Objekt als java.util.Date verlassen.

2

Ja, es auch gut funktioniert 3.3 Hibernate, verwenden ojdbc6.jar und in Annotation das Datum wie Wie andere haben unter

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

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

zeitzustempeln ändern bereits erwähnt, müssen Sie java.sql.Timestamp verwenden, um die Zeit zu bekommen.

Wenn Sie jedoch die Annotation @Temporal(TemporalType.TIMESTAMP) in einer Oracle-Spalte DATE verwenden, wird sich Hibernate beschweren und Schema-Validierungsfehler auslösen. Denen zu vermeiden, fügen Sie ein columnDefinition wie folgt aus:

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

Ich kann das nicht genug! Dies sollte die akzeptierte Antwort sein! –

0

ich in das gleiche Problem vor kurzem war. Hier ist mein Ansatz ...

In diesem Fall definieren Sie einen für Schleife in der QueryImplementation-Klasse, so dass es überprüft den Typ aller Spalten der Datenbanktabelle. Wenn der Spaltenname vom Typ DATE ist, fügen Sie dem Abfrage-Generator addScalar ("columnName", new Timestamptype()) hinzu. Auf diese Weise wird in den Datumsspalten der Zeitstempel in der Java-Anwendung angezeigt.

Sie finden den folgenden Beispielcode:

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); 
     } 
    } 

Hoffnung, das hilft.

Rakesh.

0

Vielleicht ein bisschen spät, aber in meinem Fall war die Lösung, nur @Temporal (TemporalType.DATE) zu meinem Datum-Feld hinzuzufügen.

@Temporal(TemporalType.DATE) 
private Date date; 

Und eine andere Lösung, die wir gefunden (wenn die erste nicht funktioniert hat) war ausdrücklich zu sagen, die Art Ruhezustand:

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