在运行时覆盖NativeQuery

时间:2014-10-11 18:41:01

标签: jpa derby

我在项目中使用OpenJPA和SqlServer,我需要为特定查询使用本机SqlServer语法。为此,我一直在使用NativeQuery注释,效果很好。

但是,当我需要使用Derby作为我的数据库运行单元测试时,问题就出现了。事实证明,Derby不支持我的NativeQuery的确切语法。我的想法是用一个" Derbified"换掉NativeQuery。用于运行测试的版本。但是,我还没有找到办法做到这一点。

有没有办法在运行时覆盖或重新定义实体的NativeQuery?

1 个答案:

答案 0 :(得分:2)

我会使用 persistence.xml 来定义两个peristence-unit元素(一个用于SqlServer,另一个用于Derby),其中包含{{1>的 orm.xml }}。

的persistence.xml

named-native-query

ORM-sqlserver.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>

ORM-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 TOP 1 * FROM Order</query>
    </named-native-query>
</entity-mappings>

通过这种方法,您可以提高代码的互操作性,因为实体(可跨数据库移植)与查询(特定于供应商)分离。您所需要的只是在运行时选择适当的持久性单元并执行给定的查询(它们必须具有相同的名称)。

我想到的另一种方法是使用具有不同<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注释为每个实体定义两次命名本机查询,但在运行时您可能会需要一些&#34; ifology&#34;确定一个合适的。