我想使用本机查询为具有计算距离的消息实现投影
@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
。你必须手动配置它。