2009-07-11 16 views
0

Ich habe die folgenden Felddefinitionen in einer meiner JPA-Entitäten:JPQL und Zeitstempel mit Zeitzone

@Column(nullable = false, name = "start_time", 
columnDefinition= "TIMESTAMP WITH TIME ZONE") 
@Temporal(javax.persistence.TemporalType.TIMESTAMP) 
private Date startTime = new Date(); 

@Column(nullable = true, name = "end_time", 
columnDefinition= "TIMESTAMP WITH TIME ZONE") 
@Temporal(javax.persistence.TemporalType.TIMESTAMP) 
private Date endTime = null; 

Die Datenbank PostgreSQL ist und Zeitstempel verwenden, ohne Zeitzone ist keine Option. Die Einfügungen und Aktualisierungen sind in Bezug auf die Zeitzone in Ordnung. Ein Problem entsteht (zumindest denke ich), wenn ich versuche, eine SELECT JPQL-Abfrage für einige Testdaten auszuführen, und die Filterparameter sind Date-Objekte. Die Abfrage, die OpenJPA generiert, enthält nicht die Zeitzone in den Parametern. Kann mir jemand eine Anleitung bezüglich JPA und Timestamp mit Zeitzonenspalten geben?

Antwort

-1

Sie können java.util.Calendar überprüfen.

0

Ich würde die Verwendung von Datum und Kalender in JPA-Entitäten vermeiden, wenn sie in der Datenbank gespeichert werden. Standard JDBC-Zeitwerte haben kein Konzept von Zeitstempeln.

Ich verwende den folgenden Stil statt

private Long effectiveDate; 
public Date getEffectiveDate() { 
    if (effectiveDate == null) { return null; } 
    return new Date(effectiveDate); 
} 
public void setEffectiveDate(Date d) { 
    if (d == null) { effectiveDate = null; } 
    effectiveDate = d.getTime(); 
} 

effektiv die Daten, die in der Datenbank gespeichert werden ein einfacher long-Wert ist. In der Anwendungsebene verwenden Sie jedoch weiterhin die Date-Objekte, die das Konzept der Zeitzonen haben.

Jetzt möchten Sie manchmal noch das Datum für Abfragezwecke auf Datenbankebene speichern. In diesem Fall können Sie Folgendes tun

private Long effectiveDate; 
private Date effectiveDateDate; 
public Date getEffectiveDate() { 
    if (effectiveDate == null) { return null; } 
    return new Date(effectiveDate); 
} 
public void setEffectiveDate(Date d) { 
    effectiveDateDate = d; 
    if (d == null) { effectiveDate = null; } 
    effectiveDate = d.getTime(); 
} 
Verwandte Themen