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

时间:2009-11-02 01:28:28

标签: java hibernate orm jpa jpql

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

SELECT CURRENT_TIMESTAMP

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

SELECT CURRENT_TIMESTAMP
FROM Customer c
WHERE c.id=1

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

感谢,

2 个答案:

答案 0 :(得分:15)

根据JSR 220: Enterprise JavaBeans 3.0规范:

  

4.6.16功能表达

     

Java Persistence查询语言   包括以下内置功能   功能,可用于   查询的WHERE或HAVING子句

     

如果任何参数的值为a   函数表达式为null或   未知,功能的价值   表达未知。

     

[...]

     

4.6.16.3日期时间函数

functions_returning_datetime:=
             CURRENT_DATE |
             CURRENT_TIME |
             CURRENT_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();
}

答案 1 :(得分:0)

对于 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" 适用于 H2 和 postgres“在我的系统上”(TM)