首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate 5 HQL translator for Oracle Spatial

Hibernate 5 HQL translator for Oracle Spatial
EN

Stack Overflow用户
提问于 2016-01-19 02:41:33
回答 1查看 1.1K关注 0票数 0

我正在将一个应用程序从Hibernate 3.6.10.Final升级到5.0.7。最后,我现在遇到的主要问题是,在此之前,Oracle方言何时会生成一个足够快的查询,如下所示:

代码语言:javascript
复制
SELECT * FROM MY_TABLE 
WHERE SDO_RELATE(geom,SDO_GEOMETRY(?,4326),'mask=INSIDE+COVEREDBY') ='TRUE'

现在它将生成一些非常慢的东西:

代码语言:javascript
复制
SELECT * FROM MY_TABLE 
WHERE MDSYS.OGC_WITHIN(MDSYS.ST_GEOMETRY.FROM_SDO_GEOM(geom),MDSYS.ST_GEOMETRY.FROM_SDO_GEOM(?))=1 

这将不会按时完成,并引发事务超时:

代码语言:javascript
复制
JTA transaction unexpectedly rolled back (maybe due to a timeout

我只能认为,为了将HQL转换为适当性能的Oracle空间SQL而使用的任何方言类都有问题。

我的配置如下。

pom.xml:

代码语言:javascript
复制
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.0.7.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.0.7.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-spatial</artifactId>
        <version>5.0.7.Final</version>
    </dependency>

我的persistence.xml,其中我将Atomikos (4.0.0M4)配置为事务管理器。

代码语言:javascript
复制
<persistence-unit name="pers_unit_name" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jta_data_source_name</jta-data-source>
<mapping-file>oracle.hbm.xml</mapping-file>
<class>...</class>
<properties>
        <property name="hibernate.dialect" value="org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect" />
        <property name="hibernate.spatial.dialect" value="org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect" />
        <property name="hibernate.spatial.connection_finder" value="org.geolatte.geom.codec.db.oracle.DefaultConnectionFinder" />
        <property name="hibernate.connection.autocommit" value="false" />
        <property name="hibernate.transaction.manager_lookup_class" value="com.atomikos.icatch.jta.hibernate4.TransactionManagerLookup" />
         <property name="transaction.factory_class"
            value="org.hibernate.transaction.JTATransactionFactory" />          
        <property name="hibernate.transaction.jta.platform" value="com.atomikos.icatch.jta.hibernate4.AtomikosPlatform"/> 
        <property name="hibernate.transaction.coordinator_class" value="jta"/>
        <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider" />
    </properties>
</persistence-unit>

当我调试HQLQueryPlan时,我看到它内部使用的查询转换器是:

代码语言:javascript
复制
org.hibernate.hql.internal.ast.QueryTranslatorImpl

不确定这是对还是错,也不确定如何配置才能生成正确的查询。

此应用程序在Tomcat 8上运行。

与Hibernate一起使用来映射实体的POJO包含geom属性,其定义如下:

代码语言:javascript
复制
@Column(name = "geom", columnDefinition="Geometry", nullable = true)
protected Geometry geom;
EN

回答 1

Stack Overflow用户

发布于 2016-01-20 02:43:01

看起来设置OGC_STRICT=false起到了作用。这告诉Hibernate使用Oracle自己的空间函数直接使用,而不是使用开放地理空间兼容函数,正如我们可以在OGC compliance setting文档中读到的那样。

实际上,我们已经在org.hibernatespatial.oracle.OracleSpatial10gDialect.properties文件中设置了它,但是因为在升级之后它应该以org.hibernate.spatial.dialect.oracle.OracleSpatial10gDialect.properties命名,所以它对我们不起作用。

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

https://stackoverflow.com/questions/34861793

复制
相关文章

相似问题

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