如何使用JPQL获取数据库时间?

Max*_*Max 11 java orm hibernate jpa jpql

使用本机SQL我使用如下语句获取数据库时间:

SELECT CURRENT_TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

使用JPQL我得到相同的结果:

SELECT CURRENT_TIMESTAMP
FROM Customer c
WHERE c.id=1
Run Code Online (Sandbox Code Playgroud)

有没有办法摆脱最后两行?

谢谢,

Pas*_*ent 16

根据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
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

@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();
}
Run Code Online (Sandbox Code Playgroud)

  • 使用 JPA 2.1,这仅适用于“SELECT CURRENT_TIMESTAMP AS DATE_VALUE FROM DUAL”。对于上述查询,JPA 抱怨缺少 FROM 关键字。这在以前的版本中有效吗? (2认同)