Вопрос

с помощью собственного SQL я получаю время базы данных с помощью такой инструкции:

SELECT CURRENT_TIMESTAMP

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

SELECT CURRENT_TIMESTAMP
FROM Customer c
WHERE c.id=1

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

Спасибо,

Это было полезно?

Решение

Согласно ДСР 220:Корпоративные JavaBeans 3.0 Характеристики:

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

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

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

[...]

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

functions_returning_datetime:=
             CURRENT_DATE |
             CURRENT_TIME |
             CURRENT_TIMESTAMP

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

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

Для меня «правильный» способ сделать это — создать класс с полем даты типа 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();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top