使用本机 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 函数返回数据库服务器上当前日期、时间和时间戳的值。
因此,我已经很惊讶您可以编写不符合规范的第二种形式,因此可能无法移植。
对我来说,做到这一点的“正确”方法是创建一个类型为日期字段的类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();
}
对于 java 8,一个会更新Date
为Instant
,所以我将@Pascal 的代码更改为:
import java.time.Instant;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class DateItem {
private Instant date;
/**
* @return the date
*/
@Id
@Column(name = "DATE_VALUE")
public Instant getDate() {
return date;
}
/**
* @param date
* the date to set
*/
public void setDate(Instant date) {
this.date = date;
}
}
进而:
/**
* @return System date on DB server
*/
public Instant getSystemDate() {
Query query = em.createNativeQuery(
"SELECT CURRENT_TIMESTAMP AS DATE_VALUE", DateItem.class);
DateItem dateItem = (DateItem) query.getSingleResult();
return dateItem.getDate();
}
注意:SELECT
@Dominic 指出,它已更改以使其正常工作。但是,"SELECT CURRENT_TIMESTAMP AS DATE_VALUE FROM DUAL"
将适用于 H2,但不适用于 postgres。"SELECT CURRENT_TIMESTAMP AS DATE_VALUE"
适用于“在我的系统上”(TM)的 H2 和 postgres