【问题标题】:Portable JPA 2.0 select current date/time/timestamp便携式 JPA 2.0 选择当前日期/时间/时间戳
【发布时间】:2019-08-31 22:27:12
【问题描述】:

是否可以使用 JPA 保留关键字 CURRENT_DATE、CURRENT_TIME 和 CURRENT_TIMESTAMP 进行选择当前日期/时间/时间戳的可移植 JPA 2.0 查询?

我知道这在 Oracle 11g 中有效:

<named-native-query name="getOracleSysdate">
     <query>SELECT TO_CHAR(SYSDATE, 'MM-DD-YYYY HH24:MI:SS') FROM DUAL</query>
</named-native-query> 

我知道这在 PostgreSQL 中有效:

<named-native-query name="getPostgreCurrentTimestamp">
    <query>SELECT CURRENT_TIMESTAMP</query>
</named-native-query>

我的问题基本上是,第二个查询(针对 PostgreSQL)是否适用于每个数据库? 如果不是,那么是否可以编写 named-query(不是 named-native-query)以使应用程序可移植?至少可以在 PostgreSQL 和 Oracle 11g/12c 之间移植?还是 CriteriaApi 查询?

【问题讨论】:

  • 这两个查询返回不同的东西。第一个返回一个字符串(varchar),第二个返回一个timestamp
  • 我知道,我没有说它们是一样的,我只是说它们都在工作:)
  • 我只想从数据库中以任何形式携带当前日期和时间

标签: postgresql jpa oracle11g jpa-2.0 oracle12c


【解决方案1】:

好吧,我能想到的最好的方法如下:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
                        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="MyPersistenceUnit" transaction-type="JTA">

        <mapping-file>META-INF/orm_db_oracle.xml</mapping-file>

    </persistence-unit>

</persistence>

还有 2 个 ORM 文件,具体取决于数据库类型,第一个用于 Oracle 11g:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd">

    <named-native-query name="getCurrentDateAndTimeFromDatabase">
        <query>SELECT CURRENT_DATE FROM DUAL</query>
    </named-native-query>

</entity-mappings>

还有一个用于 PostgreSQL 的:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.0"
    xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd">

    <named-native-query name="getCurrentDateAndTimeFromDatabase">
        <query>SELECT CURRENT_TIMESTAMP</query>
    </named-native-query>

</entity-mappings>

然后我可以使用 Maven 配置文件切换它们。

注意 Oracle CURRENT_DATE 与 PostgreSQL CURRENT_TIMESTAMP 等效(或最相似)。如果我要求 Oracle 返回 CURRENT_TIMESTAMP,JPA 将尝试转换为包含时区的 Java 对象,如果我要求 PostgreSQL 返回 CURRENT_DATE,我不会在 java.util.Date 中获得 TIME 部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-10
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多