首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行时重写NativeQuery

在运行时重写NativeQuery
EN

Stack Overflow用户
提问于 2014-10-12 02:41:01
回答 1查看 152关注 0票数 0

我在我的项目中使用OpenJPA和SqlServer,并且我需要对特定的查询使用原生SqlServer语法。为此,我一直在使用NativeQuery注解,并取得了很好的效果。

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

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

EN

回答 1

Stack Overflow用户

发布于 2014-10-12 06:49:04

我将使用persistence.xml定义两个peristence-unit元素(一个用于SqlServer,另一个用于Derby),并使用包含named-native-query的专用orm.xml。

persistence.xml

代码语言:javascript
复制
<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-sqlserver.xml

代码语言:javascript
复制
<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>

orm-derby.xml

代码语言:javascript
复制
<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>

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

我想到的另一种方法是使用具有不同namequery属性的@NamedNativeQuery注释为每个实体定义两次命名原生查询,但是在运行时,您可能需要一些"ifology“来确定合适的查询。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26317960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档