高德地图经纬度距离数据库排序,Spring Data JPA,Kotlin 实现版本
1.数据库函数定义
//继承默认的数据库Dialect,注册自定义sql函数
class CustomMysql8Dialect : MySQL8Dialect() {init {val factor = "?1"val latitude1 = "?2"val longitude1 = "?3"val latitude2 = "?4"val longitude2 = "?5"//高德地图距离计算registerFunction("dis", SQLFunctionTemplate(DoubleType.INSTANCE,"""asin(sqrt(pow(cos($latitude1 * $factor) * cos($longitude1 * $factor)-cos($latitude2 * $factor) * cos($longitude2 * $factor),2) +pow(cos($latitude1 * $factor) * sin($longitude1 * $factor)-cos($latitude2 * $factor) * sin($longitude2 * $factor),2) +pow(sin($latitude1 * $factor)-sin($latitude2 * $factor),2))/ 2.0) * 1.27420015798544E7""".trimIndent()))}
}//高德地图经纬度类
class LatLng(latitude: Double, longitude: Double) {private val latitude: Doubleprivate val longitude: Doubleinit {this.longitude = if (-180.0 <= longitude && longitude < 180.0) formatDouble(longitude)else formatDouble(((longitude - 180.0) % 360.0 + 360.0) % 360.0 - 180.0)this.latitude = formatDouble(max(-90.0, min(90.0, latitude)))}companion object {private var decimalFormat: DecimalFormat = DecimalFormat("0.000000", DecimalFormatSymbols(Locale.US))private fun formatDouble(double: Double): Double = java.lang.Double.parseDouble(decimalFormat.format(double))}//高德地图距离计算fun calculateLineDistance(other: LatLng): Double {val longitude1 = this.longitudeval latitude1 = this.latitudeval longitude2 = other.longitudeval latitude2 = other.latitudeval factor = 0.01745329251994329return asin(sqrt(pow(cos(latitude1 * factor) * cos(longitude1 * factor) -cos(latitude2 * factor) * cos(longitude2 * factor), 2.0) +pow(cos(latitude1 * factor) * sin(longitude1 * factor) -cos(latitude2 * factor) * sin(longitude2 * factor), 2.0) +pow(sin(latitude1 * factor) -sin(latitude2 * factor), 2.0))/ 2.0) * 1.27420015798544E7}
}
2.配置JPA使用自定义Dialect
spring.jpa.properties.hibernate.dialect=包名.CustomMysql8Dialect
3.项目中使用案例
val order = mutableListOf<Order>()
if (latitude != null && longitude != null) {val function = cb.function("dis", Double::class.java,cb.literal(0.01745329251994329),//前端传来的经纬度cb.literal(latitude),cb.literal(longitude),//数据库的经纬度字段shopInfo[ShopInfo_.latitude],shopInfo[ShopInfo_.longitude])order.add(when (distanceSort) {"desc" -> cb.desc(function)"asc" -> cb.asc(function)else -> cb.asc(function)})
}
query.orderBy(*order.toTypedArray()).groupBy(root[Merchant_.shop][Shop_.id]).where(*restrictions.toTypedArray()).restriction
高德地图经纬度距离数据库排序,Spring Data JPA,Kotlin 实现版本相关推荐
- 使用Spring Data JPA进行分页和排序
通过代码示例学习使用Spring Data JPA进行分页和排序 . 了解如何使用Springs PagingAndSortingRepository接口获取分页和排序结果. 1概述 在处理大量数据时 ...
- SpringBoot学习笔记:Spring Data Jpa的使用
更多请关注公众号 Spring Data Jpa 简介 JPA JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR ...
- hql实例 jpa_SpringBoot学习笔记九:Spring Data Jpa的使用
Spring Data Jpa 简介 JPA JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(JSR 338,这些接口 ...
- Spring Data JPA问题汇总
刚进公司,发现都用的Spring Data JPA,一脸懵,知乎上遇到了一个大佬写的文章,非常详细,分享一下,我把大佬的文章整理了一下格式,比较好看了,原文链接:https://zhuanlan.zh ...
- 使用Spring Rest和Spring Data JPA和H2以及Spring Boot示例的Restful API
你好朋友, 在本教程中,您将学习以下内容: 1.在Spring Boot中配置Spring Rest,Spring Data JPA和H2 2.使用Spring Boot创建Springful服务端点 ...
- Spring Boot的Spring Data JPA示例
1.简介 在本文中,我们将演示如何利用功能强大的Spring Data JPA API与本课程中的数据库(内存中的H2数据库)进行交互. Spring Data JPA提供了一组非常强大且高度抽象的接 ...
- SpringBoot 实战 (八) | 使用 Spring Data JPA 访问 Mysql 数据库
微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 如题,今天介绍 Spring Data JPA 的使用. 什么是 Spring Data JPA 在介绍 Spri ...
- Android开发之百度地图(soso地图,搜狗地图,阿里云地图)转高德地图经纬度的方法
//将百度地图经纬度转换为高德地图经纬度CoordinateConverter converter = new CoordinateConverter(this);// CoordType.BAIDU ...
- Spring Data Jpa 实体类自动创建数据库表失败解决
先说一下我遇到的这个问题,首先我是通过maven创建了一个spring boot的工程,引入了Spring data jpa,结果实体类创建好之后,运行工程却没有在数据库中自动创建数据表. 找了半天发 ...
- Spring Boot文档阅读笔记-使用Spring Data JPA连接多源数据库(MySQL和Oracle)
下面这个小项目展示了如何连接2个数据库,一个是Oracle,一个是MySQL. 关键的Maven依赖: <dependency><groupId>org.springframe ...
最新文章
- springboot webjar使用
- 几种机器学习算法的偏差以及防范
- enumerate()函数用法
- C++ 十字链表图转java版
- Java-Web JSP指令、javabean和EL表达式
- Spring5 版本新特性简述
- linux学习手册,Linux命令学习手册-ps
- 数据泵 远程服务端数据导出
- 极客学院微信小程序视频教程
- php源码添加多国语言包,为win7系统添加多国语言包的方法
- 怎么把Word转成PDF?转换方法很简单
- linux pack文件镜像,使用buildpack-deps 构建自己的入容器镜像
- linux系统日志报错kernel,Linux 系统日志 kernel: __ratelimit: xxx callbacks suppressed-Fun言...
- Android音频子系统(七)------数字耳机播192KHz音乐卡顿问题解析
- 正面管教php_正面管教之PHP(家长帮助家长)
- Kinect体感互动解决方案——体感人影粒子
- Python中定义函数的关键字是什么?一起来学习下吧
- bzoj 1934: [Shoi2007]Vote 善意的投票(最小割)
- android P 修改wifi热点默认名称和密码
- python练习题:045:正常血压