1

Hibernate 5.1.0.Final在 Java 应用程序中使用数据库持久性。这对我们来说会很方便,因为我们希望使用 Oracle 和 Postgres 实例,因此我们可以将此 ORM 作为抽象层。在使用 Hibernate-spatial 查询几何图形时的前一个问题中,我发布了一些配置。
现在的问题是当我们在 Oracle 中保留一些几何字段时。在我的 POJO 中,我有一个导入:

import com.vividsolutions.jts.geom.Geometry;

所以我在我的类中定义了以下属性:

@Column(name = "geom")
protected Geometry geom;

它被持久化,我可以使用谓词来查询它。但是查看数据库内部,我可以看到 geom 字段的内容是:

MDSYS.SDO_GEOMETRY(2001,4326,NULL,MDSYS.SDO_ELEM_INFO_ARRAY(1,1,1),MDSYS.SDO_ORDINATE_ARRAY(0.094,51.488))

而不是我想要的,查询速度更快,并且是 Oracle 推荐的:

MDSYS.SDO_GEOMETRY(2001,4326,MDSYS.SDO_POINT_TYPE(0.094,51.488,NULL),NULL,NULL)

我应该怎么做才能将其存储为点 ( SDO_POINT_TYPE) 而不是数组 ( SDO_ELEM_INFO_ARRAY)?

编辑:我尝试更改Point为如下所示,但据我所知,它没有任何区别。

import com.vividsolutions.jts.geom.Point;
(...)
@Column(name = "geom")
protected Point geom;
4

1 回答 1

1

在我看来,目前没有办法强制 Hibernate 将点存储为点而不是坐标数组。我对此进行了更深入的研究,并对源代码进行了调整,主要是为我自己,也为那些需要这样做的人。

我为原始项目创建了一个拉取请求。即使它可能会或可能不会被考虑用于主人,任何人都可以创建自己的定制版本,OracleJDBCTypeFactory.java从这里获取它:

https://github.com/GeoLatte/geolatte-geom/pull/42

更新:这被合并到主人。它应该为下一个版本做好准备geolate-geom。根据@maesenka 的评论:

您必须设置系统属性GEOLATTE_USE_SDO_POINT_TYPE=true才能启用此功能。

于 2016-03-18T17:31:54.670 回答