通过 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 查询。
我在 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 查询。