【问题标题】:How to get the database time with JPQL?如何使用 JPQL 获取数据库时间?
【发布时间】:2010-12-12 03:44:21
【问题描述】:

使用本机 SQL,我可以通过如下语句获取数据库时间:

SELECT CURRENT_TIMESTAMP

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

SELECT CURRENT_TIMESTAMP
FROM Customer c
WHERE c.id=1

有没有办法去掉最后两行?

谢谢,

【问题讨论】:

标签: java hibernate orm jpa jpql


【解决方案1】:

根据JSR 220: Enterprise JavaBeans 3.0规范:

4.6.16 函数表达式

Java 持久性查询语言 包括以下内置 函数,可用于 查询的 WHERE 或 HAVING 子句

如果任何参数的值 函数表达式为空或 未知,函数的值 表达方式未知。

[...]

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();
}

【讨论】:

  • 感谢您的回答。问:是否还指定了DATE_VALUE 列名?
  • 使用 JPA 2.1,这仅适用于 "SELECT CURRENT_TIMESTAMP AS DATE_VALUE FROM DUAL"。对于上述查询,JPA 抱怨缺少 FROM 关键字。这在以前的版本中有效吗?
【解决方案2】:

对于 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)

【讨论】:

    猜你喜欢
    • 2016-04-30
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2013-11-24
    相关资源
    最近更新 更多