Hibernate Spatial: как определить конверт по множеству записей - PullRequest
2 голосов
/ 12 марта 2019

У меня есть следующие данные:

База данных, содержащая адреса с указанием города, улицы, номера дома и геометрии.

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

Это может быть осуществимо для некоторых найденных адресов (до сотен), но нет, если пользователь еще не развернул ни к одному из них (всю базу данных).

Что мне нужно сейчас, так это способ указать пространственному пространству гибернации вернуть мне минимальные и максимальные координаты из возможных объектов.

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

Таким образом, можно использовать индекс базы данных и конверт извлекается мгновенно.

Есть ли способ использовать пространственный режим гибернации для запроса конвертакуча записей?Как это выполняется?

1 Ответ

1 голос
/ 14 мая 2019

Прежде всего Hibernate работает на сущностях. Ваш окончательный запрос не подходит ни к какой сущности, это пользовательские данные. Но вы можете искать как этот запрос, и вы можете получить свой результат. Я думаю, что ваш последний запрос лучше всего подходит для производительности , но если вы хотите использовать спящие пространственные запросы, подумайте о доступе к сущностям. Вы можете сделать 4 различных запроса и получить угловые объекты, а затем вручную получить доступ к угловым координатам. Вы можете построить свой запрос в зависимости от этой документации .

...