с родным SQL Я получаю время базы данных с выражением вроде:
SELECT CURRENT_TIMESTAMP
с JPQL Я получаю тот же результат:
SELECT CURRENT_TIMESTAMP
FROM Customer c
WHERE c.id=1
Есть ли способ избавиться от двух последних строк?
спасибо,
с родным SQL Я получаю время базы данных с выражением вроде:
SELECT CURRENT_TIMESTAMP
с JPQL Я получаю тот же результат:
SELECT CURRENT_TIMESTAMP
FROM Customer c
WHERE c.id=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();
}