使用的工具及其版本:
我正在使用:
- Spring Boot
2.2.6
- 休眠/休眠空间
5.3.10
方言设置为:org.hibernate.spatial.dialect.mysql.MySQL56SpatialDialect
- querydsl-空间
4.2.1
-
com.vividsolutions.jts 1.13
- jscience
4.3.1
问题描述:
我有一个代表医疗诊所的实体:
import com.vividsolutions.jts.geom.Polygon;
@Entity
public class Clinic {
@Column(name = "range", columnDefinition = "Polygon")
private Polygon range;
}
range
是之前根据诊所的gps-location
计算出来的圆和 radius
.它表示该诊所的操作区域。这意味着它只治疗家庭住址在该圈内的患者。让我们假设上面的圆圈是正确的。
我的目标(问题):
我有一个带有患者位置的 gps 点:45.7602322 4.8444941
.我想找到所有能够治疗该患者的诊所。这意味着,找到他们的所有诊所 range
字段包含 45.7602322 4.8444941
.
我的解决方案(部分正确(我认为))
为了完成它,我创建了一个简单的“Predicate”/“BooleanExpression”:
GeometryExpressions.asGeometry(QClinic.clinic.range)
.contains(Wkt.fromWkt("Point(45.7602322 4.8444941)"))
它确实有效,因为我可以在控制台中看到正确的 sql 查询:
select (...) where
ST_Contains(clinic0_.range, ?)=1 limit ?
第一个绑定(bind)参数:POINT(45.7602322 4.8444941)
但是我有两个问题:
-
QClinic.clinic.range
在 intellij 中被标记为“警告”:“Unchecked assignment: 'com.querydsl.spatial.jts.JTSPolygonPath' to 'com.querydsl.core.types.Expression<org.geolatte.geom.Geometry'
”。是的,在QClinic
范围是com.querydsl.spatial.jts.JTSPolygonPath
- 在上面的行(创建表达式)中使用调试器和 intellij 的“评估”,我可以看到有一条错误消息:“
unknown operation with operator CONTAINS and args [clinic.range, POINT(45.7602322 4.8444941)]
”
最佳答案
您可以忽略第二个警告。空间特定操作根本没有在用于操作的 toString 的序列化程序中注册。它们驻留在自己的模块中。
第一个警告表明您混淆了 Geolatte 和 JTS 表达式。从您的映射看来您打算使用 JTS。在这种情况下,您需要使用 com.querydsl.spatial.jts.JTSGeometryExpressions
而不是 com.querydsl.spatial.jts.GeometryExpressions
才能消除该警告。
关于空间查询dsl - 几何表达式。查找范围包含给定 "Point"的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61703743/