Нет сопоставления диалектов для типа JDBC: 1111 при выборе «org.locationtech.jts.geom.Точка» в собственном запросе

#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 . Вам придется настроить его вручную.