#spring-boot #kotlin #postgis #hibernate-spatial
#весенняя загрузка #kotlin #postgis #спящий режим-пространственный
Вопрос:
Я хочу реализовать проекцию для сообщений с вычисленным расстоянием, используя собственный запрос
@Entity
@Table(name= "messages")
data class Message(
@Id
@GeneratedValue
var id: Int?=null,
var message: String,
var userName: String,
var location: Point? = null
)
мой интерфейс проектирования
interface FoundMessage {
var id: Int
var message: String
var location: Point
var userName: String
var distance: Float
}
мой репозиторий
interface MessageRepository : CrudRepository<Message, Int> {
@Query(
"SELECT id,message,location,user_name as "userName", st_distance(messages.location,ST_SetSRID(st_makepoint(:#{#currentPos.x},:#{#currentPos.y}),4326)) AS "distance""
"FROM messages WHERE location amp;amp; st_makeenvelope(:#{#llb.x}, :#{#llb.y}, :#{#urt.x}, :#{#urt.y}, 4326) ORDER BY distance DESC", nativeQuery = true)
fun findByLocationWithinBoundingBoxOrderByDistance(@Param("llb") llb: Point,
@Param("urt") urt: Point,
@Param("currentPos") currentPos: Point): List<FoundMessage>
}
Как только я удаляю местоположение из своего собственного запроса, все работает нормально, и местоположение в моей проекции равно нулю.
Мой собственный запрос также работает нормально, если я возвращаю список моей сущности вместо интерфейса проекции.
Итак, проблема в том, что hibernate не может создать «org.locationtech.jts.geom.Укажите», если я использую интерфейс проецирования.
Есть идеи, как это решить? Или разные подходы?
BR
Комментарии:
1. вы решили эту проблему? Я столкнулся с этой проблемой, но пока не нашел решения.
Ответ №1:
Сообщение «нет сопоставления диалектов» обычно означает, что у вас настроен неправильный диалект. Вам нужно SpatialDialect
зарегистрировать сопоставления JDBC для пространственных типов. Проверьте сообщения журнала. Вы должны увидеть a Dialect
со словом «Spatial» в его названии.
Проблема с Spring-Boot заключается в том, что он пытается автоматически определить подходящую Dialect
для вашей базы данных. Но он не выберет SpatialDialect
. Вам придется настроить его вручную.