Hibernate Spatial和遗留数据库

时间:2016-12-16 19:03:51

标签: java hibernate hibernate-spatial

背景

我有遗留数据库,我无法更改其架构。 我的实体的映射如下:

class SomeObject {
    @Column(name = "LONGITUDE", nullable = false)
    public BigDecimal longitude;

    @Column(name = "LATITUDE", nullable = false)
    public BigDecimal latitude;

    ...
}

问题:

我需要创建一个hibernate查询,它将在一个圆圈中选择所有 SomeObjects 。 我通过 hibernate spatial 应该是解决这个问题的正确工具。 但是,我能找到的所有示例都声明了 Point 类型的列,而不是像我一样使用单独的坐标列。 由于我无法更改数据库模式,因此这种方法对我无效。

那么,我可以使用hibernate空间来解决这个问题吗? 如果是,查询将如何?

解决方案:

Karthik Prasad清楚而正确地描述了什么是空间以及我有什么选择。 因为,我使用的是Oracle DB,我还有一个选择:使用sdo_geom包。 所以,最后我使用SQL查询而不是hibernate查询/标准:

select * 
from SOMETHING
where 
-- add box to decrease number of records
-- where box is radius converted to degree by multiply on (1. / 69.) * 1.1 
:lon - :box < longitude and longitude < :lon + :box and 
:lat - :box < latitude and latitude < :lat + :box and 
sdo_geom.sdo_distance(
  sdo_geometry(2001, 4326, null, sdo_elem_info_array(1, 1, 1), sdo_ordinate_array(longitude, latitude)),
  sdo_geometry(2001, 4326, null, sdo_elem_info_array(1, 1, 1), sdo_ordinate_array(:lon, :lat)),
  1, 'unit=mile') < :radius

1 个答案:

答案 0 :(得分:0)

Hibernate Spatial专门用于具有/不带空间索引的Geometry类型的数据库。我认为只有选项是创建克隆表,其中另一列添加了几何类型点(或根据您的用例)使用Spatial扩展/模块启用的数据库。