Hibernate Spatial 和遗留数据库
Hibernate Spatial and legacy db
背景:
我有旧版数据库,我无法更改其架构。
我的实体映射如下:
class SomeObject {
@Column(name = "LONGITUDE", nullable = false)
public BigDecimal longitude;
@Column(name = "LATITUDE", nullable = false)
public BigDecimal latitude;
...
}
问题:
我需要创建休眠查询,它将 select 所有 SomeObjects 围成一圈。
我通过 hibernate spatial 应该是解决这个问题的正确工具。
但是,我能找到的所有示例都声明类型为 Point 的列,而不是像我那样使用单独的坐标列。
由于我无法更改数据库架构,因此这种方法对我不起作用。
那么,我可以使用hibernate spatial来解决这个问题吗?
如果是,查询会是什么样子?
解法:
Karthik Prasad 清楚而正确地描述了什么是空间以及我一般有哪些选择。
因为,我使用的是 Oracle DB,所以我还有一个选择:使用 sdo_geom 包。
所以,最后我使用 SQL 查询而不是休眠 query/criteria:
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
Hibernate Spatial 专门在具有 Geometry with/without Spatial Indexes 类型的数据库上运行。我认为唯一的选择是创建克隆 table,并在另一列中添加几何类型点(或根据您的用例),您的数据库启用了 Spatial extension/module。
背景:
我有旧版数据库,我无法更改其架构。 我的实体映射如下:
class SomeObject {
@Column(name = "LONGITUDE", nullable = false)
public BigDecimal longitude;
@Column(name = "LATITUDE", nullable = false)
public BigDecimal latitude;
...
}
问题:
我需要创建休眠查询,它将 select 所有 SomeObjects 围成一圈。 我通过 hibernate spatial 应该是解决这个问题的正确工具。 但是,我能找到的所有示例都声明类型为 Point 的列,而不是像我那样使用单独的坐标列。 由于我无法更改数据库架构,因此这种方法对我不起作用。
那么,我可以使用hibernate spatial来解决这个问题吗? 如果是,查询会是什么样子?
解法:
Karthik Prasad 清楚而正确地描述了什么是空间以及我一般有哪些选择。 因为,我使用的是 Oracle DB,所以我还有一个选择:使用 sdo_geom 包。 所以,最后我使用 SQL 查询而不是休眠 query/criteria:
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
Hibernate Spatial 专门在具有 Geometry with/without Spatial Indexes 类型的数据库上运行。我认为唯一的选择是创建克隆 table,并在另一列中添加几何类型点(或根据您的用例),您的数据库启用了 Spatial extension/module。