spring-boot - 构建条件 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 可以存在于括号内吗?
另外,有没有更简单的方法来做到这一点?
解决方案
是的,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);
完成了我打算做的事情。
推荐阅读
- wifi - 带有 wpa2-enterprise 和 wpa_supplicant 的静态 IP
- ios - 添加新条目后 UITableView 不会刷新
- flutter - 从 url Flutter 下载图片
- amazon-web-services - 使用 S3 作为触发器的 AWS Codepipelines。仅支持 zip 吗?
- bash - 在 shell 脚本中提示时如何提供密码
- ios - 如何在 iOS 14 的模块化架构中为 Firebase 收集 IDFA
- node.js - Node Express 路径在生产环境中不匹配(Heroku)
- node.js - 快速证书故障排除
- ruby-on-rails - 在 ruby on rails 项目上更新 redis 缓存设置
- java - 服务器只读取来自一个客户端线程的输入,并忽略来自其余线程的输入。线程客户端服务器聊天应用程序