У меня есть классы Организация и Координаты. Координаты следующие:
@Entity
@Table(name = "COORDINATES")
@Indexed
@Spatial
public class Coordinates implements Serializable {
private static final long serialVersionUID = 1L;
public Coordinates() {}
@Id
@Column(name = "id", nullable = false)
@SequenceGenerator(name = "generator", sequenceName = "COORDINATES_id_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "generator")
private Long id;
@Field
@Latitude
@Column(name = "LATITUDE", nullable = false)
private Double latitude;
@Field
@Longitude
@Column(name = "LONGITUDE", nullable = false)
private Double longitude;
Я помещаю аннотацию @IndexedEmbedded в поле координат в Организации (это @Indexed + @Entity + @Table). Почему пространственный объект не распознается в моем запросе? У меня следующее исключение:
org.hibernate.search.exception.SearchException: HSEARCH000131: поле «organization.Organization # координаты», используемое для пространственного запроса, не настроено как пространственное поле. Проверьте правильность использования @Spatial, соответственно, SpatialFieldBridge в org.hibernate.search.query.dsl.impl.ConnectedSpatialQueryBuilder.createSpatialQuery (ConnectedSpatialQueryBuilder.java:63) в org.hibernate.search.query.ConnectedSpatialQuery .java: 38)
Редактировать 1
Я попытался добавить имя к пространственной аннотации, но получил сообщение об ошибке: @Latitude и @Longitude не удалось найти. Итак, я попытался реализовать координаты Hibernate, изменив @Entity на @Embeddable, изменив @IndexedEmbedded для @Spatial в классе Organization в атрибуте coordinates
, удалив @Latitude + @Longitude в моем классе координат, переопределив getLatitude()
и getLongitude()
. Теперь у меня следующее исключение:
org.hibernate.AnnotationException: @OneToOne или @ManyToOne на com. (...). model.organization.Organization.coordinates ссылается на неизвестный объект: com. (...). model.localization.Coordinates
Я использую :
- спящее ядро: 5.2.12.Final
- hibernate-jpamodelgen: 5.2.12.Final
- hibernate-search-orm: 5.8.2.Финал
- hibernate-search-elasticsearch: 5.8.2.Финал
Я разговаривал с другими разработчиками, и мне кажется, что им нужны функции, которые изменились в более поздних версиях, поэтому мы не хотим ничего менять в данный момент.
Вот интересная часть в классе организации:
@Entity
@Table(name = "ORGANIZATION", uniqueConstraints = {@UniqueConstraint(columnNames = { "CODE" }) })
@Indexed
public class Organization implements Serializable, FileEntity {
// lots of attributes, getters, setters, constructor
@Spatial(name = "location", spatialMode = SpatialMode.RANGE)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COORDINATES_ID")
private Coordinates coordinates;
}
И модифицированный класс Coordinates:
@Embeddable
@Table(name = "COORDINATES")
@Indexed
public class Coordinates implements org.hibernate.search.spatial.Coordinates, Serializable {
// serial, constructor, id get+set
@Field
@Column(name = "LATITUDE", nullable = false)
private Double latitude;
@Field
@Column(name = "LONGITUDE", nullable = false)
private Double longitude;
@Override
public Double getLatitude() {
return this.latitude;
}
@Override
public Double getLongitude() {
return this.longitude;
}
}
Редактировать 2
Я добавил "(of =" location ")" в @Latitude и @Longitude. У меня все еще есть ошибка:
Сообщение об ошибке: {"root_cause": [{"type": "query_shard_exception", "reason": "не удалось найти поле geo_point [координаты.location]» (...)
Может это из запроса? Запрос :
final BooleanJunction bool = queryBuilder.bool().must(queryBuilder.bool()
.should(...)
.should(...)
.should(queryBuilder
.spatial()
.onField("coordinates.location")
.within(12, Unit.KM)
.ofLatitude(form.getLatitude())
.andLongitude(form.getLongitude())
.createQuery())
.createQuery())
.must(...)
.must(...)
.must(...);
final FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(bool.createQuery(), Organization.class);
fullTextQuery.setMaxResults(form.getMaximumNumberOfResult());
fullTextQuery.setProjection(FullTextQuery.SPATIAL_DISTANCE, FullTextQuery.THIS);
fullTextQuery.setSpatialParameters(form.getLatitude(), form.getLongitude(), "coordinates.location");
fullTextQuery.setProjection(FullTextQuery.THIS, FullTextQuery.SCORE);
Поле «Координаты» в Organization - это @IndexedEmbedded, а класс Coordinates такой, как вы его написали.