Hibernate Spatial:如何确定大量条目的信封

Hibernate Spatial: how to determine an envelope over lots of entries

我有以下内容:

包含城市、街道、门牌号和几何图形的地址的数据库。

@Id
@Column(name = "fid", unique = true)
private Integer fid;
@Column(name = "city")
private String city;
@Column(name = "street")
private String street;
@Column(name = "houseNumber")
private String houseNumber;
@javax.persistence.Column(name = "GEOM")
private Geometry geom;

我希望用户输入(部分)街道名称 and/or 城市名称并搜索匹配的地址(SQL:“SELECT * FROM address WHERE street LIKE '%<streetinput>%' AND city LIKE '%<cityinput>%'”)。

最后,地图将被缩放到一个包含所有匹配地址的信封中。在地图上稍微向下钻取。

由于地址table比较大(小县城:几十万个地址),将它们全部检索并处理坐标以确定包络是非常低效的。

伪代码:

envelope = emptyEnvelope;
foreach (address in foundAddresses) {
    envelope.expandToInclude(address.geometry);
}

这对于找到的一些地址(最多数百个)可能是可行的,但如果用户尚未深入到其中任何一个(整个数据库)则不可行。

我现在需要的是一种告诉 hibernate spatial return 我可能对象中最小和最大坐标的方法。

sql for oracle(仅在 mysql、postgis 等中访问会有所不同):

SELECT 
    MIN(b.GEOM.sdo_point.x) AS minX, MAX(b.GEOM.sdo_point.x) AS maxX,
    MIN(b.GEOM.sdo_point.y) AS minY, MAX(b.GEOM.sdo_point.y) AS maxY
FROM 
    addresses b
WHERE street LIKE ... AND city LIKE ...;

这样可以使用数据库索引并立即检索信封。

有没有办法使用hibernate spatial查询一堆条目的信封? 它是如何执行的?

首先,Hibernate 适用于实体。您的最终查询不适合任何实体,它是自定义数据。但是你可以像这个查询一样搜索,你可以得到你的结果。 我认为您的最终查询最适合性能,但如果您想使用休眠空间查询,请考虑访问实体。您可以执行 4 种不同的查询并获取角实体,然后手动访问角坐标。您可以根据 this documentation.

构建查询