Comment obtenir le temps de base de données avec JPQL?
Question
avec SQL natif je reçois le temps de base de données avec une déclaration comme:
SELECT CURRENT_TIMESTAMP
avec JPQL je reçois le même résultat avec:
SELECT CURRENT_TIMESTAMP
FROM Customer c
WHERE c.id=1
Yat-il un moyen de se débarrasser des deux dernières lignes?
merci,
La solution
Selon le JSR 220: Enterprise JavaBeans 3.0 spécifications:
4.6.16 Expressions fonctionnelles
Le langage de requête Java Persistence comprend les haut-suite fonctions, qui peuvent être utilisés dans le Clause where ou having d'une requête .
Si la valeur d'un argument à une l'expression fonctionnelle est nulle ou inconnue, la valeur de la fonction l'expression est inconnue.
[...]
4.6.16.3 Fonctions Datetime
functions_returning_datetime:= CURRENT_DATE | CURRENT_TIME | CURRENT_TIMESTAMP
Les fonctions datetime renvoient le valeur de date, l'heure et horodatage sur le serveur de base de données.
Je suis déjà surpris que vous pouvez écrire la 2ème forme qui ne sont pas correctes par spécification et pourrait donc pas être portable.
Pour moi, le « droit » façon de le faire serait de créer une classe avec un champ de date de type java.util.Date
et de le remplir avec une requête native. Quelque chose comme ça:
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;
}
}
Et puis:
@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();
}