Portable JPA 2.0选择当前日期/时间/时间戳

问题描述 投票:0回答:1

是否可以使用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)是否适用于每个数据库?如果没有,那么是否可以编写命名查询(非命名本机查询)以使应用程序可移植?至少可以在PostgreSQL和Oracle 11g / 12c之间移植吗?还是CriteriaApi查询?

postgresql jpa oracle11g jpa-2.0 oracle12c
1个回答
0
投票

好的,我能想到的最好的是:

<?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部分。

© www.soinside.com 2019 - 2024. All rights reserved.