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

时间:2017-06-14 18:00:04

标签: spring-data-jpa jpql

我在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>

祝你好运

1 个答案:

答案 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查询替换本机查询。