建立条件式JPQL语句

时间:2018-08-01 23:36:44

标签: spring-boot expression conditional-statements 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吗?

还有,有更简单的方法吗?

1 个答案:

答案 0 :(得分:0)

是的,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);

完成了我打算要做的事情。