2014-10-11 3 views
0

Я использую OpenJPA с SqlServer в моем проекте, и мне нужно использовать собственный синтаксис SqlServer для конкретного запроса. Для этого я использую аннотацию NativeQuery с отличными результатами.Переопределить NativeQuery во время выполнения

Однако проблема возникает, когда мне нужно запустить единичный тест с Derby в качестве моей базы данных. Как оказалось, Derby не поддерживает точный синтаксис моего NativeQuery. Моя мысль состоит в том, чтобы заменить NativeQuery на «Derbified» версию для запуска теста. Однако я не смог найти способ сделать это.

Есть ли способ переопределить или переопределить NativeQuery для объекта во время выполнения?

ответ

2

Я хотел бы использовать persistence.xml для определения двух peristence-unit элементов (один для SqlServer и другой для Derby) с выделенной orm.xml содержащей named-native-query.

persistence.xml

<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="sqlserver-pu"> 
     <mapping-file>META-INF/orm-sqlserver.xml</mapping-file> 
     ... 
    </persistence-unit> 

    <persistence-unit name="derby-pu"> 
     <mapping-file>META-INF/orm-derby.xml</mapping-file> 
     ... 
    </persistence-unit> 
</persistence> 

ОРМ-sqlserver.xml

<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="findFirst" result-class="com.tyler.example.order"> 
     <query>SELECT TOP 1 * FROM Order</query> 
    </named-native-query> 
</entity-mappings> 

ОРМ-derby.xml

<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="findFirst" result-class="com.tyler.example.order"> 
     <query>SELECT * FROM Order FETCH FIRST ROW ONLY</query> 
    </named-native-query> 
</entity-mappings> 

При таком подходе вы улучшили совместимость вашего кода, объекты (переносимые через базы данных) отделяются от запросов (специфических поставщиков). Все, что вам нужно, - выбрать подходящую единицу времени выполнения во время выполнения и выполнить заданный запрос (они должны иметь одно и то же имя).

Другой подход, который приходит мне в голову, чтобы определить именованный родной запрос дважды для каждого объекта с использованием @NamedNativeQuery аннотацию с различными name и query атрибутов, но во время выполнения вы бы тогда, вероятно, потребуется некоторое «ifology», чтобы определить правильный один.

Смежные вопросы