Spring JPA Query не распознает пространственные типы - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь создать собственный запрос с помощью весенней аннотации JPA Query с использованием типов данных Spacial. Запрос отлично работает, когда его просят выполнить через консоль или даже в базе данных. Но когда его просят использовать через весну. Кто-нибудь знает, что я делаю не так? или есть лучший способ добиться того же результата (оставив все вычисления БД односторонними)? Заранее спасибо

Это запрос, который я пытаюсь выполнить. Опять же, он работает через консоль, но не выполняется через запрос весенней загрузки

@Query(value = "SELECT TOP 1 * FROM Vehicles v " +
            "JOIN Bikelots l ON l.BikeLotId = v.BikeLotId " +
            "JOIN BikeTypes b ON b.BikeTypeId = l.BikeTypeId " +
            "WHERE b.BikeTypeId = ?1 " +
            "ORDER BY " +
            "Geography::STGeomFromText(v.Point.MakeValid().STAsText(),4326) " +
            ".STDistance(Geography::STGeomFromText(Geometry::Point(?2,?3,4326).MakeValid().STAsText(),4326)) "
            , nativeQuery = true)
com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near 'Geography:'.

Я использую этот диалект в application.properties

spring.jpa.database-platform=org.hibernate.spatial.dialect.sqlserver.SqlServer2008SpatialDialect

1 Ответ

1 голос
/ 11 октября 2019

Данная ошибка была вызвана тем, что jpa hibernate распознает символ ":" в качестве заполнителя для предстоящей переменной.

Поместив запрос в строковую переменную, затем добавив "\\" перед каждым ":"и присвоение строки значению @Query, решило проблему. Смотрите код для примера

String query = "SELECT TOP 1 * FROM Vehicles v " +
        "JOIN Bikelots l ON l.BikeLotId = v.BikeLotId " +
        "JOIN BikeTypes b ON b.BikeTypeId = l.BikeTypeId " +
        "WHERE b.BikeTypeId = ?1 " +
        "ORDER BY " +
        "Geography\\:\\:STGeomFromText(v.Point.MakeValid().STAsText(),4326) " +
        ".STDistance(Geography\\:\\:STGeomFromText(Geometry\\:\\:Point(?2,?3,4326).MakeValid().STAsText(),4326)) ";
    @Query(value = query, nativeQuery = true)

...