Portable JPA 2.0 выберите текущую дату / время / метку времени - PullRequest
0 голосов
/ 10 апреля 2019

Можно ли создать переносимый запрос JPA 2.0, который выбирает текущую дату / время / метку времени, используя зарезервированные ключевые слова JPA CURRENT_DATE, CURRENT_TIME и CURRENT_TIMESTAMP?

Я знаю, что это работает в 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?

1 Ответ

0 голосов
/ 14 апреля 2019

ОК, лучшее, что я могу придумать, это следующее:

<?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, я не получу часть TIME в java.util.Date.

...