用于Oracle Spatial的Hibernate 5 HQL转换器

用于Oracle Spatial的Hibernate 5 HQL转换器,oracle,hibernate,jta,oracle-spatial,Oracle,Hibernate,Jta,Oracle Spatial,我正在将一个应用程序从Hibernate 3.6.10.Final升级到5.0.7.Final 我现在面临的主要问题是,什么时候Oracle方言会生成这样一个足够快的查询: SELECT * FROM MY_TABLE WHERE SDO_RELATE(geom,SDO_GEOMETRY(?,4326),'mask=INSIDE+COVEREDBY') ='TRUE' 现在它将产生非常缓慢的结果: SELECT * FROM MY_TABLE WHERE MDSYS.OGC_WITHIN(

我正在将一个应用程序从Hibernate 3.6.10.Final升级到5.0.7.Final 我现在面临的主要问题是,什么时候Oracle方言会生成这样一个足够快的查询:

SELECT * FROM MY_TABLE 
WHERE SDO_RELATE(geom,SDO_GEOMETRY(?,4326),'mask=INSIDE+COVEREDBY') ='TRUE'
现在它将产生非常缓慢的结果:

SELECT * FROM MY_TABLE 
WHERE MDSYS.OGC_WITHIN(MDSYS.ST_GEOMETRY.FROM_SDO_GEOM(geom),MDSYS.ST_GEOMETRY.FROM_SDO_GEOM(?))=1 
此操作不会按时完成并引发事务超时:

JTA transaction unexpectedly rolled back (maybe due to a timeout
我只能认为,为了将HQL转换为性能良好的Oracle spatial SQL,所使用的任何方言类都有问题

我的配置如下

pom.xml:

    <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>
不确定这是正确的还是错误的,也不确定如何将其配置为生成正确的查询

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

与Hibernate一起用于映射实体的POJO包含geom属性,该属性定义为:

@Column(name = "geom", columnDefinition="Geometry", nullable = true)
protected Geometry geom;

看起来设置
OGC\u STRICT=false
成功了。这告诉Hibernate使用Oracle自己的空间函数,这些函数直接使用,而不是像我们在文档中看到的那样使用与开放地理空间兼容的函数


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

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

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

org.hibernate.hql.internal.ast.QueryTranslatorImpl
@Column(name = "geom", columnDefinition="Geometry", nullable = true)
protected Geometry geom;