Come ottenere il tempo database con JPQL?
Domanda
con SQL nativo ho tempo database con una dichiarazione come:
SELECT CURRENT_TIMESTAMP
con JPQL ottengo lo stesso risultato con:
SELECT CURRENT_TIMESTAMP
FROM Customer c
WHERE c.id=1
C'è un modo per sbarazzarsi delle ultime due righe?
grazie,
Soluzione
Secondo il JSR 220: Enterprise JavaBeans 3.0 specifiche:
4.6.16 Espressioni funzionali
Il linguaggio di query Java Persistence comprende la seguente incorporato funzioni, che possono essere utilizzati nella WHERE o HAVING di una query .
Se il valore di qualsiasi argomento per un espressione funzionale è nullo o sconosciuto, il valore del funzionale espressione è sconosciuta.
[...]
4.6.16.3 Funzioni Datetime
functions_returning_datetime:= CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP
Le funzioni restituiscono il datetime valore della corrente data, ora, e timestamp sul server di database.
Così sto già sorpreso è possibile scrivere il 2 ° modulo che non è corretta secondo la specifica e potrebbe quindi non essere portabile.
Per me, il modo "giusto" per farlo sarebbe quello di creare una classe con un campo data di tipo java.util.Date
e popolarlo con una query nativo. Qualcosa del genere:
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;
}
}
E poi:
@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();
}