Как получить время базы данных с помощью JPQL?

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

SELECT CURRENT_TIMESTAMP

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

SELECT CURRENT_TIMESTAMP
FROM Customer c
WHERE c.id=1

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

спасибо,

Ответ 1

В соответствии со спецификациями JSR 220: Enterprise JavaBeans 3.0:

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

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

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

[...]

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

functions_returning_datetime:=
             CURRENT_DATE |
             CURRENT_TIME |
             CURRENT_TIMESTAMP

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

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

Для меня "правильным" способом было бы создать класс с полем даты типа 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();
}