Portable JPA 2.0 выберите текущую дату / время / временную метку

#postgresql #jpa #oracle11g #jpa-2.0 #oracle12c

#postgresql #jpa #oracle11g #jpa-2.0 #oracle12c

Вопрос:

Возможно ли создать переносимый запрос 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>
  

Мой вопрос в основном заключается в том, будет ли этот 2-й запрос (для PostgreSQL) работать с каждой базой данных?
Если нет, то возможно ли написать именованный запрос (не именованный собственный запрос), чтобы приложение было переносимым? Хотя бы переносимость между PostgreSQL и Oracle 11g / 12c? Или запрос CriteriaApi?

Комментарии:

1. Эти два запроса возвращают разные вещи. Первый возвращает строку ( varchar ), второй возвращает a timestamp .

2. я знаю, я не говорил, что они одинаковые, я просто сказал, что они оба работают 🙂

3. я просто хочу переносить текущую дату и время из базы данных в любой форме

Ответ №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.