Wie die Datenbank Zeit mit JPQL zu bekommen?
Frage
mit nativen SQL erhalte ich die Datenbank Zeit mit einer Aussage wie:
SELECT CURRENT_TIMESTAMP
mit JPQL ich das gleiche Ergebnis mit:
SELECT CURRENT_TIMESTAMP
FROM Customer c
WHERE c.id=1
Gibt es eine Möglichkeit der letzten beiden Zeilen loswerden?
Danke,
Lösung
Nach dem JSR 220: Enterprise Javabeans 3.0 Spezifikationen:
4.6.16 Funktionale Ausdrücke
Die Java Persistence Query Language enthält die folgenden Einbau- Funktionen, , die in die verwendet werden können, WHERE oder HAVING-Klausel einer Abfrage .
Wenn der Wert eines Arguments ein funktionelle Expression ist null oder unbekannt, wird der Wert des Funktions Ausdruck ist nicht bekannt.
[...]
4.6.16.3 für Datum und Uhrzeit Funktionen
functions_returning_datetime:= CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP
Die Datetime-Funktionen geben die Wert der aktuelle Datum, die Uhrzeit und Zeitstempel auf dem Datenbankserver.
Also ich bin schon überrascht, dass Sie die zweite Form schreiben können, die nicht korrekt pro Spezifikation und könnten somit nicht tragbar sein.
Für mich bin der „richtige“ Weg, dies zu tun wäre, eine Klasse mit einem Datumsfeld vom Typ java.util.Date
zu erstellen und es mit einer nativen Abfrage zu füllen. Etwas wie folgt aus:
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@Entity
public class DateItem {
private Date date;
/**
* @return the date
*/
@Id
@Column(name = "DATE_VALUE")
@Temporal(TemporalType.TIMESTAMP)
public Date getDate() {
return date;
}
/**
* @param date
* the date to set
*/
public void setDate(Date date) {
this.date = date;
}
}
Und dann:
@PersistenceContext
EntityManager em;
/**
* @return System date on DB server
*/
public Date getSystemDate() {
Query query = em.createNativeQuery(
"SELECT CURRENT_TIMESTAMP", DateItem.class);
DateItem dateItem = (DateItem) query.getSingleResult();
return dateItem.getDate();
}