首页 > 解决方案 > 构建条件 JPQL 语句

问题描述

这是我目前在 Spring Boot 中定义存储库方法的 JPQL 语句。

@Query("SELECT s FROM Station s WHERE s.latitude <= (:latitude + .5) AND"
       + "s.latitude >= (:latitude - .5) AND "
       + "s.longitude <= (:longitude + .5) AND "
       + "s.longitude >= (:longitude - .5)")
List<Station> findAllNear(@Param("latitude") double latitude,
                          @Param("longitude") double longitude);

此语句背后的前提是我想在给定坐标周围的 1 度乘 1 度框中找到任何和所有站点(如果有的话)。我不关心实际距离,因为结果将由我在其他地方的业务逻辑细化。

我遇到的问题是,这在 180 度经度附近效果不佳(在两极附近也不行,但我并不担心这一点,因为此时我们询问远北的可能性很小)

具体来说,如果有人要询问位于经度 180 度或附近的位置,它将找不到位于 -179.5 或更近的站点。

我应该如何调整 JPQL 来处理这些情况?是唯一一种在经度上也测试 +- 360 度的方法吗?是否可以使用 JPQL 以这种方式集群组?

A && B && ((C && D) || (E && F) || (G && H))

JPQL 语言文档说表达式中允许使用括号,但它在表达式运算符之间列出了 AND 和 OR。AND 和 OR 可以存在于括号内吗?

另外,有没有更简单的方法来做到这一点?

标签: spring-bootexpressionconditional-statementsjpql

解决方案


是的,JPQL 允许在括号内的表达式之间插入,所以形式的参数

A && B && ((C && D) || (E && F) || (G && H))

已验证。将我的选择语句更改为:

@Query("SELECT s FROM Station s WHERE (s.latitude <= (:latitude + .5) AND"
   + "s.latitude >= (:latitude - .5)) AND "
   + "(s.longitude <= (:longitude + .5) AND s.longitude >= (:longitude - .5)) OR "
   + "(s.longitude <= (:longitude + 360.5) AND s.longitude >= (:longitude +359.5)) OR "
   + "(s.longitude <= (:longitude - 359.5) AND s.longitude >= (:longitude - 360.5)))")
List<Station> findAllNear(@Param("latitude") double latitude,
                      @Param("longitude") double longitude);

完成了我打算做的事情。


推荐阅读