我给出了以下内容:

一个包含城市,街道,门牌号和几何形状的地址的数据库。

@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;


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

最后,地图将缩放到包含所有匹配地址的信封。在地图上略微下钻。

由于地址表相当大(一个小县:很多100000个地址),因此检索所有地址并处理坐标以确定信封是非常不理想的。

伪代码:

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


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

我现在需要的是一种告诉休眠空间在可能的对象中向我返回最大和最小坐标的方法。

oracle的sql(仅在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在实体上工作。您的最终查询不适用于任何属于自定义数据的实体。但是您可以像这种查询一样搜索,并且可以获得结果。我认为您的最终查询最适合提高性能,但是如果您要使用休眠空间查询,请考虑访问实体。您可以执行4个不同的查询并获取角实体,然后手动访问角坐标。您可以根据this documentation建立查询。

关于java - Hibernate Spatial:如何确定大量条目的信封,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55118663/

10-10 08:46