org.hibernate.engine.jdbc.spi.SqlExceptionHelper — функция WITHIN не найдена; Оператор SQL

Здесь я пытаюсь найти всех тех сущностей, которые находятся в пределах предоставленного диапазона. Я имею в виду, что если я дам круг определенного радиуса, он должен будет показать все объекты, имеющие координаты местоположения, расположенные внутри данного круга.

Я использую hibernate-spatial для достижения этой цели. Но получение упомянутой ошибки в интерфейсе репозитория JPA.

Вот pom.xml,

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-spatial</artifactId>
    <version>5.2.12.Final</version>
</dependency>
<dependency>
    <groupId>org.opengeo</groupId>
    <artifactId>geodb</artifactId>
    <version>${project.version}</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.6</version>
</dependency>

JPA-репозиторий,

public interface ResourceRepository extends ExtendedJpaRepository<Resource, String> {   
    @Query(value = "select resource from Resource resource where within(resource.address.location, :circle) = true")
    List<Resource> test(@Param("circle") Geometry circle);
}

Resource.java,

@Entity
@NoArgsConstructor
public class Resource extends UUIDEntity2 implements IsResource {

    @Type(type = "org.hibernate.spatial.GeometryType")
    @OneToOne
    private Address address;

    /*getters setters*/
}

Address.java ,

@Entity
public class Address extends UUIDEntity2 implements HasEmailAddress, HasLocation {

    @Embedded
    @Column(columnDefinition = "point")
    private Location location;
    /*getters setters*/
}

location.java,

@Embeddable
@Value(staticConstructor = "of")
@RequiredArgsConstructor(staticName = "of")
public class Location implements Serializable {

    @Column(nullable = true)
    private Double lat;

    @Column(nullable = true)
    private Double lon;
}

тест,

    @Inject
    private ResourceRepository resourceRepository;

    public Geometry createCircle(double x, double y, double radius) {
        GeometricShapeFactory shapeFactory = new GeometricShapeFactory();
        shapeFactory.setNumPoints(32);
        shapeFactory.setCentre(new Coordinate(x, y));
        shapeFactory.setSize(radius * 2);
        return shapeFactory.createCircle();
    }

    @Test
    public void geometry(){
        Geometry m = createCircle(0.0, 0.0, 5);
        List<Resource> resources = resourceRepository.test(m);
    }

application.properties,

hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect

NB: здесь не показаны все свойства сущностей. Ссылка Я следую: Hibernate-Spatial


person Chinmoy Acharjee    schedule 19.03.2019    source источник


Ответы (1)


Похоже, у вас не настроен SpatialDialect для MySQL. Можете ли вы проверить, есть ли у вас линия

hibernate.dialect=org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect

в файле hibernate.properties.

Вы также можете проверить журналы, чтобы увидеть, какой диалект на самом деле используется Hibernate. Он должен иметь «Пространственный» в имени, чтобы пространственные функции были доступны для перехода в спящий режим.

person Karel Maesen    schedule 20.03.2019
comment
Я добавил его в файл application.properties. Но в журнале говорится, что он использует «org.hibernate.dialect.H2Dialect». Как его тогда настроить? - person Chinmoy Acharjee; 21.03.2019