我在Java应用程序中使用Hibernate 5.1.0.Final
来实现数据库持久性。这对我们来说很方便,因为我们期望打到Oracle和Postgres实例,因此我们可以将这个ORM作为抽象层。
在former issue when querying geometries using 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;
答案 0 :(得分:1)
在我看来,目前没有办法强制Hibernate将点存储为点而不是坐标数组。我深入研究了这个问题,我对源代码进行了调整,主要是为了我,但对于那些需要这样做的人也是如此。
我为原始项目创建了一个拉取请求。即使它可能会或可能不会被主人考虑,任何人都可以从这里创建自己的OracleJDBCTypeFactory.java
自定义版本:
https://github.com/GeoLatte/geolatte-geom/pull/42
更新:这已合并为主人。它应该为下一版geolate-geom
做好准备。根据@maesenka的评论:
您必须设置系统属性
GEOLATTE_USE_SDO_POINT_TYPE=true
才能启用此功能。