Как получить время базы данных с JPQL? - PullRequest
10 голосов
/ 02 ноября 2009

с нативным SQL Я получаю время базы данных с оператором вроде:

SELECT CURRENT_TIMESTAMP

с JPQL Я получаю тот же результат с:

SELECT CURRENT_TIMESTAMP
FROM Customer c
WHERE c.id=1

Есть ли способ избавиться от последних двух строк?

спасибо,

1 Ответ

15 голосов
/ 02 ноября 2009

Согласно спецификации JSR 220: Enterprise JavaBeans 3.0 :

4.6.16 Функциональные выражения

Язык запросов Java Persistence включает в себя следующие встроенные функции, , которые могут быть использованы в WHERE или HAVING предложение запроса .

Если значение какого-либо аргумента для функциональное выражение равно нулю или неизвестно, значение функционала выражение неизвестно.

[...]

4.6.16.3 Функции даты и времени

functions_returning_datetime:=
             CURRENT_DATE |
             CURRENT_TIME |
             CURRENT_TIMESTAMP

Функции datetime возвращают значение текущей даты, времени и отметка времени на сервере базы данных.

Так что я уже удивлен, что вы можете написать 2-ю форму, которая не соответствует спецификации и, следовательно, может быть не переносимой.

Для меня «правильный» способ сделать это - создать класс с полем даты типа java.util.Date и заполнить его собственным запросом. Примерно так:

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

А потом:

@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();
}
...