空间查询dsl - 几何表达式。查找范围包含给定 "Point" 的实体

Spatial querydsl - GeometryExpressions. Find entities that range contains given "Point"

使用的工具及其版本:

我正在使用:

问题描述:

我有一个代表医疗诊所的实体:

import com.vividsolutions.jts.geom.Polygon;

@Entity
public class Clinic {

    @Column(name = "range", columnDefinition = "Polygon")
    private Polygon range;
}

range是之前根据诊所的gps-locationradius计算出来的圆。它表示该诊所的操作区域。这意味着它只治疗家庭住址在该圈内的患者。让我们假设上面的圆圈是正确的。

我的目标(问题):

我有一个带患者位置的 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 ?

第一个绑定参数:POINT(45.7602322 4.8444941)

但是我有两个问题:

  1. QClinic.clinic.range 在 intellij 中被标记为 "warning" 为:“Unchecked assignment: 'com.querydsl.spatial.jts.JTSPolygonPath' to 'com.querydsl.core.types.Expression<org.geolatte.geom.Geometry'”。是的,在 QClinic 范围内是 com.querydsl.spatial.jts.JTSPolygonPath
  2. 在上面的行(创建表达式)中使用调试器和 intellij 的 "evaluate" 我可以看到有一条错误消息:“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 来消除该警告。