0

背景:

我有旧版数据库,我无法更改其架构。我的实体的映射如下所示:

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

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

    ...
}

问题:

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

那么,我可以使用休眠空间来解决这个问题吗?如果是,查询会是什么样子?

解决方案:

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

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
4

1 回答 1

0

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

于 2017-01-06T09:11:37.010 回答