通过 jpql 别名关键字多次使用表达式

multiple use of expression via jpql alias keyword

我在 postgresql 服务器上使用 spring 数据,我想执行一些 GPS 数据范围查询。这意味着,给定一个坐标,我即时计算从入口到给定点的距离,并检查某个范围。

因为我还想订购关于距离的数据,另外我也想检索实际距离,所以在 sql 中我会使用 AS 关键字只计算一次表达式,然后使用这个辅助在 where 和 order by part 中的表达式。 但是,到目前为止,我还没有想出如何在 jqpl 中执行此操作。所以我的查询应该做这样的事情:

SELECT NEW Result(p, <distance-expression>) FROM MyModel p where <distance-expression> <= :rangeParam order by <distance-expression>

但是,恐怕每个条目都会被计算多次,因此这会对查询的 runtime/response 时间产生负面影响。

jqpl有没有办法使用AS关键字来避免多重求值
<distance-expression>?

此致

具有内部视图的本机查询应该可以完成工作。假设 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 查询。