在本机查询中选择 "org.locationtech.jts.geom.Point" 时,JDBC 类型:1111 没有方言映射



我想使用本机查询为具有计算距离的消息实现投影

@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 && 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>
}

一旦我从我的原生查询中删除了location,一切都很好,并且location在我的投影中为null。如果我返回实体的List而不是投影接口,那么我的本机查询也可以正常工作。所以问题是hibernate不能创建";org.locationtech.jts.geom.Point"如果我使用投影界面。

有什么解决办法吗?还是不同的方法?

BR

;没有方言映射";消息通常意味着您并没有配置正确的方言。您需要一个SpatialDialect来注册空间类型的JDBC映射。检查日志消息。你应该看到一个CCD_ 2;"空间";以其名义。

Spring Boot的问题在于,它试图自动为数据库找出一个合适的Dialect。但它不会选择SpatialDialect。你必须手动配置它。

最新更新