我在postgresql服务器上使用spring数据,我想执行一些GPS数据范围查询。这意味着,给定一个坐标,我可以即时计算从入口到给定点的距离,并检查一定范围。
因为我也想订购关于距离的数据,另外我也想要检索实际距离,在sql中我会使用AS关键字只计算一次表达式,然后在where和the中使用这个辅助表达式按部分排序。 但是,到目前为止,我还没有想出如何在jqpl中做到这一点。所以我的查询应该做这样的事情:
SELECT NEW Result(p, <distance-expression>) FROM MyModel p where <distance-expression> <= :rangeParam order by <distance-expression>
但是,我担心每个条目会对其进行多次评估,因此这会对查询的运行时/响应时间产生负面影响。
在jqpl中是否有任何方法可以使用AS关键字来避免多次评估
<distance-expression>
?
祝你好运
答案 0 :(得分:0)
具有内部视图的本机查询应该完成工作。假设class Location(id, latitude, longitude)
和Haversine formula用于查找大圆上的点之间的距离,以下存储库方法声明应该足够自定义:
@Query(nativeQuery = true
, value = "SELECT "
+ " r.id "
+ " , r.latitude "
+ " , r.longitude "
+ "FROM "
+ " (SELECT "
+ " l.id AS id "
+ " , l.latitude AS latitude "
+ " , l.longitude AS longitude "
+ " , 2 * 6371 * ASIN(SQRT(POWER(SIN(RADIANS((l.latitude - ?1) / 2)), 2) + COS(RADIANS(l.latitude))*COS(RADIANS(?1))*POWER(SIN(RADIANS((l.longitude - ?2) / 2)), 2))) AS distance "
+ " FROM "
+ " location l) AS r "
+ "WHERE "
+ " r.distance < ?3")
List<Location> findAllByProximity(BigDecimal latitude
, BigDecimal longitude
, BigDecimal distance);
示例可用on Github作为示例(假设公制单位)。
注意:在示例中使用本机查询而不是JPQL的原因是缺少对JPQL中三角函数的支持。如果表达式更简单并且可以使用本机JPQL函数进行编码,则可以使用JPA查询替换本机查询。